Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
真・なぜ誰もこう書いてくれないDependency Injection入門
Search
Koji Saiki
October 30, 2017
Programming
800
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
100
Angular で PCF した話
kojisaiki
0
580
Why is the subject of the story about Java support JDK?
kojisaiki
0
150
いまどきのSIer的品質向上
kojisaiki
0
170
誰も教えてくれなかったSEとしてただ一つ必要なこと
kojisaiki
0
480
なぜ誰もこう書いてくれない Dependency Injection
kojisaiki
5
1.9k
Other Decks in Programming
See All in Programming
2年かけて Deno に DOMMatrix を実装した話 / How I implemented DOMMatrix in Deno over two years
petamoriken
0
110
yield再入門 #phpcon
o0h
PRO
0
720
型も通る、synthも通る、それでも危ない 〜AIのCDKの権限とコストを機械で検証する〜 / It Passes Type Checks, It Passes Synth Checks, but It’s Still Risky — Automatically Verifying Permissions and Costs in AI’s CDK —
seike460
PRO
1
420
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
1.3k
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
16
3.6k
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
190
Embedded SREと共に達成した会員管理システムのAWS移行 - SRE NEXT 2026 ランチスポンサーセッション
niftycorp
PRO
1
2.9k
「正の参照」と 「負の導出」で組む ハーネスエンジニアリング
cottpan
1
150
ITヒヤリハットを整理してみた ~ライフサイクルと原因から考える再発防止策~
koukimiura
1
110
AI時代、エンジニアはどう育つのか -未経験エンジニアの成長を間近で見て考えたこと-
thasu0123
0
140
AIキャラアプリkaiwaの低遅延音声通話基盤をどう作ったか - AWS Gravitonで支える低遅延・低コストAI Agent基盤
mogamit
0
180
Hatena Engineer Seminar #37「言語モデルの活用に関する研究」
slashnephy
0
540
Featured
See All Featured
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
230
First, design no harm
axbom
PRO
2
1.2k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
640
Art, The Web, and Tiny UX
lynnandtonic
304
22k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
BBQ
matthewcrist
89
10k
Designing for Performance
lara
611
70k
Tell your own story through comics
letsgokoyo
1
1k
WCS-LA-2024
lcolladotor
0
750
エンジニアに許された特別な時間の終わり
watany
108
250k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.9k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
420
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 ͓ΘΓ