Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
真・なぜ誰もこう書いてくれないDependency Injection入門
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Koji Saiki
October 30, 2017
Programming
810
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
真・なぜ誰もこう書いてくれないDependency Injection入門
Koji Saiki
October 30, 2017
More Decks by Koji Saiki
See All by Koji Saiki
Scaffold for Read and Debug JavaScript
kojisaiki
0
110
Angular で PCF した話
kojisaiki
0
590
Why is the subject of the story about Java support JDK?
kojisaiki
0
150
いまどきのSIer的品質向上
kojisaiki
0
180
誰も教えてくれなかったSEとしてただ一つ必要なこと
kojisaiki
0
480
なぜ誰もこう書いてくれない Dependency Injection
kojisaiki
5
1.9k
Other Decks in Programming
See All in Programming
Press start. Python's next generation.
willingc
PRO
3
330
Deep dive into the select statement (GopherCon UK)
jespino
0
170
LoopHub - ローカルで動く GitHub で、AI と共同開発
jugyo
1
490
GKE で Pod の見方を変えたら、スケールアウト時の挙動を真に捉えられた話
stkk
0
110
Vibes Containers 〜AIで変わるコンテナ設計と運用〜
tkikuc
3
520
【高い買い物LT会】初任給で話題の国産フィジカルAIを買った話
akagami
PRO
0
130
XP祭りでしか伝わらないフリップネタ #xpjug
murabayashi
0
120
コンパウンドプロダクト開発のためのローカルプロセスマネージャー再発明 #layerxgo
izumin5210
0
660
型解析で実現する Go の言語内 DSL / Conference に Go! タイムテーブルの歩き方 for Gophers
mazrean
0
140
ソフトウェアラスタライザ
fadis
1
800
Family mrubyの進捗
kishima
1
110
Intent as Code
shoppingjaws
6
720
Featured
See All Featured
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
320
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
How to Think Like a Performance Engineer
csswizardry
28
2.8k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
67k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
Chasing Engaging Ingredients in Design
codingconduct
0
300
Documentation Writing (for coders)
carmenintech
77
5.5k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1k
A Soul's Torment
seathinner
7
3.6k
How to make the Groovebox
asonas
2
2.4k
Transcript
ͳͥ୭͜͏ॻ͍ͯ͘Εͳ͍ %FQFOEFODZ*OKFDUJPOೖ TBJLPV LPKJTBJLJ ਅ
͓·͑୭ ͓ͳ·͑ɿࠤഢߛೋʢ͍͖͜͞͏͡ʣ ͱ͜ΖɿԬʗେࡕ ͭͿ͖ɿIUUQTUXJUUFSDPNTBJLPV ͗ͬͿɿIUUQTHJUIVCDPNLPKJTBJLJ ͿΖ͙ɿIUUQJSPOZIBUFOBCMPHDPN
%*ೖʹ؊͕ॻ͔Εͯ ແ͍ʢେʣ
ਅͷ%*ೖΛ͓ݟͤ͠· ͠ΐ͏ ʆɾТɾ
͍ΘΏΔzೖαΠτz Ұ୴Ε·͠ΐ͏
ΞδΣϯμ %*Λz֮͑Δz %*Λzղ͘z ·ͱΊ
ΞδΣϯμ %*Λz֮͑Δz %*Λzղ͘z ·ͱΊ
ૣίʔυΛݟ·͠ΐ͏
class GasolineCar { private GasolineEngine engine; constructor() { this.engine =
new GasolineEngine(); } startEngine() { this.engine.start(); } accelEngine() { this.engine.accelerate(); } } ˞ٙࣅίʔυͰ͢
class DieselCar { private DieselEngine engine; constructor() { this.engine =
new DieselEngine(); } startEngine() { this.engine.start(); } accelEngine() { this.engine.accelerate(); } }
ͳΜͱ͔͍ͨ͠ɾɾɾ &OHJOFҎ֎࠶ར༻Ͱ͖ͦ͏ &OHJOF͍ํʢTUBSUͱ͔ʣಉͬ͡Ά͍ class GasolineCar { private GasolineEngine engine; constructor()
{ this.engine = new GasolineEngine(); } startEngine() { this.engine.start(); } accelEngine() { this.engine.accelerate(); } } class DieselCar { private DieselEngine engine; constructor() { this.engine = new DieselEngine(); } startEngine() { this.engine.start(); } accelEngine() { this.engine.accelerate(); } }
interface Engine { void start(); void accelerate(); } class Car
{ private Engine engine; public Car(Engine _engine) { this.engine = _engine; } void startEngine() { this.engine.start(); } void accelEngine() { this.engine.accelerate(); } }
interface Engine { void start(); void accelerate(); } class Car
{ private Engine engine; public Car(Engine _engine) { this.engine = _engine; } void startEngine() { this.engine.start(); } void accelEngine() { this.engine.accelerate(); } } *OUFSGBDFΛ ҾͰͤεοΩϦʂ
Ҏ্ʂ %*͓ΘΓʂ
ͬͨͶʂ
ʁ z͍ํಉ͚ͩ͡Ͳಈ͖͕ҧ͏Πϯελϯεz ɺ͏ॴΑΓ֎͔Β༩͑Εղܾʂ
ʁ z͍ํಉ͚ͩ͡Ͳಈ͖͕ҧ͏Πϯελϯεz ɺ͏ॴΑΓ֎͔Β༩͑Εղܾʂ %*ͷߟ͑ํʮ͜Ε͚ͩʯʂϚδͰɻ
֮͋͑͞Α͏ʂ z͍ํಉ͚ͩ͡Ͳಈ͖͕ҧ͏Πϯελϯεz
֮͋͑͞Α͏ʂ z͍ํಉ͚ͩ͡Ͳಈ͖͕ҧ͏Πϯελϯεz z͍ํಉ͚ͩ͡Ͳಈ͖͕ҧ͏Πϯελϯεz
֮͋͑͞Α͏ʂ z͍ํಉ͚ͩ͡Ͳಈ͖͕ҧ͏Πϯελϯεz z͍ํಉ͚ͩ͡Ͳಈ͖͕ҧ͏Πϯελϯεz z͍ํಉ͚ͩ͡Ͳಈ͖͕ҧ͏Πϯελϯεz
֮͋͑͞Α͏ʂ z͍ํಉ͚ͩ͡Ͳಈ͖͕ҧ͏Πϯελϯεz z͍ํಉ͚ͩ͡Ͳಈ͖͕ҧ͏Πϯελϯεz z͍ํಉ͚ͩ͡Ͳಈ͖͕ҧ͏Πϯελϯεz
ΞδΣϯμ %*Λz֮͑Δz %*Λzղ͘z ·ͱΊ
Α͋͘Δz%*ͷޮೳz ༷มߋʹڧ͘ͳΔ ςετ͕͘͢͠ͳΔ
༷มߋʹڧ͘ͳΔ
༷มߋʹڧ͘ͳΔ ʹ҆શʹมߋͰ͖Δ
༷มߋʹڧ͘ͳΔ ʹ҆શʹมߋͰ͖Δ ʹӨڹൣғ͕ݮΔ
%*લ class Owner { main() { GasolineCar gasolineCar = New
GasolineCar(); DieselCar dieselCar = New DieselCar(); } } class GasolineCar {} class DieselCar {} )ZCSJE$BSΛՃ ͠Α͏
%*લ class Owner { main() { GasolineCar gasolineCar = New
GasolineCar(); DieselCar dieselCar = New DieselCar(); // Ճ HybridCar hybridCar = New HybridCar(); } } class GasolineCar {} class DieselCar {} class HybridCar { private HybridEngine engine; public HybridCar() { this.engine = new HybridEngine(); } startEngine() { this.engine.start(); } accelEngine() { this.engine.accelerate(); } } ͜ͷ͘Β͍Ճ
%*ޙ class Owner { main() { GasolineEngine gasolineEngine = new
GasolineEngine(); Car gasolineCar = new Car(gasolineEngine); DieselEngine dieselEngine = new DieselEngine(); Car dieselCar = new Car(dieselEngine); } } interface Engine { void start(); void accelerate(); } class Car { private Engine engine; public Car(Engine _engine) { this.engine = _engine; } void startEngine() { this.engine.start(); } void accelEngine() { this.engine.accelerate(); } }
%*ޙ class Owner { main() { GasolineEngine gasolineEngine = new
GasolineEngine(); Car gasolineCar = new Car(gasolineEngine); DieselEngine dieselEngine = new DieselEngine(); Car dieselCar = new Car(dieselEngine); // Ճ HybridEngine hybridEngine = new HybridEngine(); Car hybridCar = new Car(hybridEngine); } } interface Engine { void start(); void accelerate(); } class Car { private Engine engine; public Car(Engine _engine) { this.engine = _engine; } void startEngine() { this.engine.start(); } void accelEngine() { this.engine.accelerate(); } } ͜Ε͚ͩͰ0,
༷มߋʹڧ͘ͳͬͨʂ
ςετ͕͘͢͠ͳΔ
ςετ͕͘͢͠ͳΔ ʹग़ೖޱ͕҆ఆ͢Δ
ςετ͕͘͢͠ͳΔ ʹग़ೖޱ͕҆ఆ͢Δ ʹΠϯλϑΣʔεͷ ɹՃɾมߋ͕ݮΔ
%*લ class Owner { main() { GasolineCar gasolineCar = New
GasolineCar(); DieselCar dieselCar = New DieselCar(); // Ճ HybridCar hybridCar = New HybridCar(); } } class GasolineCar {} class DieselCar {} class HybridCar { private HybridEngine engine; public HybridCar() { this.engine = new HybridEngine(); } startEngine() { this.engine.start(); } accelEngine() { this.engine.accelerate(); } }
%*લ class Owner { main() { GasolineCar gasolineCar = New
GasolineCar(); DieselCar dieselCar = New DieselCar(); // Ճ HybridCar hybridCar = New HybridCar(); } } class GasolineCar {} class DieselCar {} class HybridCar { private HybridEngine engine; public HybridCar() { this.engine = new HybridEngine(); } startEngine() { this.engine.start(); } accelEngine() { this.engine.accelerate(); } } ૿͑ͨΠϯλϑΣʔε
%*લ class Owner { main() { GasolineCar gasolineCar = New
GasolineCar(); DieselCar dieselCar = New DieselCar(); // Ճ HybridCar hybridCar = New HybridCar(); } } class GasolineCar {} class DieselCar {} class HybridCar { private HybridEngine engine; public HybridCar() { this.engine = new HybridEngine(); } startEngine() { this.engine.start(); } accelEngine() { this.engine.accelerate(); } } ςετ͢Δൣғ
%*ޙ class Owner { main() { GasolineEngine gasolineEngine = new
GasolineEngine(); Car gasolineCar = new Car(gasolineEngine); DieselEngine dieselEngine = new DieselEngine(); Car dieselCar = new Car(dieselEngine); // Ճ HybridEngine hybridEngine = new HybridEngine(); Car hybridCar = new Car(hybridEngine); } } interface Engine { void start(); void accelerate(); } class Car { private Engine engine; public Car(Engine _engine) { this.engine = _engine; } void startEngine() { this.engine.start(); } void accelEngine() { this.engine.accelerate(); } }
%*ޙ class Owner { main() { GasolineEngine gasolineEngine = new
GasolineEngine(); Car gasolineCar = new Car(gasolineEngine); DieselEngine dieselEngine = new DieselEngine(); Car dieselCar = new Car(dieselEngine); // Ճ HybridEngine hybridEngine = new HybridEngine(); Car hybridCar = new Car(hybridEngine); } } interface Engine { void start(); void accelerate(); } class Car { private Engine engine; public Car(Engine _engine) { this.engine = _engine; } void startEngine() { this.engine.start(); } void accelEngine() { this.engine.accelerate(); } } ૿͑ɾɾɾͯͳ͍ʂ
%*ޙ class Owner { main() { GasolineEngine gasolineEngine = new
GasolineEngine(); Car gasolineCar = new Car(gasolineEngine); DieselEngine dieselEngine = new DieselEngine(); Car dieselCar = new Car(dieselEngine); // Ճ HybridEngine hybridEngine = new HybridEngine(); Car hybridCar = new Car(hybridEngine); } } interface Engine { void start(); void accelerate(); } class Car { private Engine engine; public Car(Engine _engine) { this.engine = _engine; } void startEngine() { this.engine.start(); } void accelEngine() { this.engine.accelerate(); } } ͜ͷྲྀΕ͚ͩ ςετ͢Ε0,
ςετ͘͢͠ͳͬͨʂ
Α͋͘Δz%*ͷޮೳz ༷มߋʹڧ͘ͳΔ ςετ͕͘͢͠ͳΔ
Α͋͘Δz%*ͷޮೳz ༷มߋʹڧ͘ͳΔ ςετ͕͘͢͠ͳΔ 2&% ʢূ໌ऴྃʣ
͜͜·ͰͰ͖ͨਓ ࣍ʹԿΛߟ͑Δʁ
͜͜·ͰͰ͖ͨਓ ࣍ʹԿΛߟ͑Δʁ ͦͦΠϯελϯεΛOFX͢Δॲཧॻ͖ͨ ͘ͳ͍ʂ
͜͜·ͰͰ͖ͨਓ ࣍ʹԿΛߟ͑Δʁ ͦͦΠϯελϯεΛOFX͢Δॲཧॻ͖ͨ ͘ͳ͍ʂ ςετͷ࣌ͱຊ൪ͷ࣌ͰΠϯελϯεΛΓସ ͍͚͑ͨͲɺίʔυ৮Γͨ͘ͳ͍ʂ
͜͜·ͰͰ͖ͨਓ ࣍ʹԿΛߟ͑Δʁ ͦͦΠϯελϯεΛOFX͢Δॲཧॻ͖ͨ ͘ͳ͍ʂ ςετͷ࣌ͱຊ൪ͷ࣌ͰΠϯελϯεΛΓସ ͍͚͑ͨͲɺίʔυ৮Γͨ͘ͳ͍ʂ ͦΜͳপͳྟػԠมͳػೳΛΘ͟Θࣗ͟Ͱ࡞ Γͨ͘ͳ͍ʂ
͜͜·ͰͰ͖ͨਓ ࣍ʹԿΛߟ͑Δʁ ͦͦΠϯελϯεΛOFX͢Δॲཧॻ͖ͨ ͘ͳ͍ʂ ςετͷ࣌ͱຊ൪ͷ࣌ͰΠϯελϯεΛΓସ ͍͚͑ͨͲɺίʔυ৮Γͨ͘ͳ͍ʂ ͦΜͳপͳྟػԠมͳػೳΛΘ͟Θࣗ͟Ͱ࡞ Γͨ͘ͳ͍ʂ ͬͱָʹɾɾɾ
͜͜·ͰͰ͖ͨਓ ࣍ʹԿΛߟ͑Δʁ ͦͦΠϯελϯεΛOFX͢Δॲཧॻ͖ͨ ͘ͳ͍ʂ ςετͷ࣌ͱຊ൪ͷ࣌ͰΠϯελϯεΛΓସ ͍͚͑ͨͲɺίʔυ৮Γͨ͘ͳ͍ʂ ͦΜͳপͳྟػԠมͳػೳΛΘ͟Θࣗ͟Ͱ࡞ Γͨ͘ͳ͍ʂ ͬͱָʹɾɾɾ
4QSJOH%*ͷ߹ @Component class GasolineEngine { ... } @ComponentScan class MyApp
{ public static void main(String[] args) { ... } } class Car { @Autowired private Engine engine; public Car() { } ... }
4QSJOH%*ͷ߹ @Component class GasolineEngine { ... } @ComponentScan class MyApp
{ public static void main(String[] args) { ... } } class Car { @Autowired private Engine engine; public Car() { } ... }
4QSJOH%*ͷ߹ @Component class GasolineEngine { ... } @ComponentScan class MyApp
{ public static void main(String[] args) { ... } } class Car { @Autowired private Engine engine; public Car() { } ... } Ξϊςʔγϣϯ͚ͭΔ ͚ͩͰOFXͯ͠ϑΟʔϧυʹηο τͯ͘͠ΕΔ ʹ͍͢͝
͜Μͳ;͏ʹ %*ͯ͘͠ΕΔࠇຐज़ ʹ͍ΘΏΔz%*ίϯςφz
৽͍͠%*ίϯςφʹ ग़ձͬͨΒ
৽͍͠%*ίϯςφʹ ग़ձͬͨΒ ͲΜͳهड़ͰউखʹOFXͯ͘͠ΕΔ͔ΛΖ͏ʂ
৽͍͠%*ίϯςφʹ ग़ձͬͨΒ ͲΜͳهड़ͰউखʹOFXͯ͘͠ΕΔ͔ΛΖ͏ʂ ͲΜͳهड़Ͱউखʹೖͯ͘͠ΕΔ͔ΛΖ͏ʂ
৽͍͠%*ίϯςφʹ ग़ձͬͨΒ ͲΜͳهड़ͰউखʹOFXͯ͘͠ΕΔ͔ΛΖ͏ʂ ͲΜͳهड़Ͱউखʹೖͯ͘͠ΕΔ͔ΛΖ͏ʂ ͲΜͳϧʔϧͰɺΠϯελϯεͱೖઌ͕ඥ͚ͮ ΒΕΔ͔ΛΖ͏ʂ
4QSJOH%*ͷ߹ @Component(“engine”) class GasolineEngine implements Engine { ... } class
Car { @Autowired private Engine engine; public Car() { } ... } @Component(“old_engine”) class DieselEngine implements Engine { ... }
4QSJOH%*ͷ߹ @Component(“engine”) class GasolineEngine implements Engine { ... } class
Car { @Autowired private Engine engine; public Car() { } ... } @Component(“old_engine”) class DieselEngine implements Engine { ... }
ΞδΣϯμ %*Λz֮͑Δz %*Λzղ͘z ·ͱΊ
·ͱΊ %*z͍ํಉ͚ͩ͡Ͳಈ͖͕ҧ͏Πϯελϯ εzΛ֎͔Βೖͯ͠εοΩϦͤ͞Δ͜ͱɻ͋ͱ શ෦ͦͷԆઢ্ɻ %*ίϯςφɺͪΐͬͱ໋ྩ͢Ε%*ͯ͘͠Ε Δศརͳͭɻ
͓·͚ z%*ίϯςφzͱ͍͏ݴ༿Λ ಄ʹམͱ͢ίπ
͜͏͡Όͳͯ͘
͜͏
Ͱɺ͜͏ ΦϒδΣΫτ Πϯελϯε γϯάϧτϯ औΓଗ͑ͯ·͢ʂ ΦʔμʔϝΠυ ঝΓ·͢ʂ
TBJLPV LPKJTBJLJ ͓ΘΓ