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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Koji Saiki
October 30, 2017
Programming
790
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
140
いまどきのSIer的品質向上
kojisaiki
0
170
誰も教えてくれなかったSEとしてただ一つ必要なこと
kojisaiki
0
470
なぜ誰もこう書いてくれない Dependency Injection
kojisaiki
5
1.9k
Other Decks in Programming
See All in Programming
JJUG CCC 2026 Spring: JSpecify で実現する Kotlin フレンドリーな Java API 設計
ternbusty
1
160
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
210
メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65
utgwkk
3
690
Copilot CLI の継戦能力を高める コンテキスト管理
nozomutu
1
1.2k
ローカルLLMでどこまでコードが書けるか -拡張版 / How much code can be written on a local LLM Extended
kishida
2
1.3k
AutonomyとControlのあいだ:Graflowで記述するAIエージェント協調
myui
0
120
A2UI という光を覗いてみる
satohjohn
1
130
Swiftのレキシカルスコープ管理
kntkymt
0
220
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
230
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
260
タクシーアプリ『GO』の バックエンド開発のおける AI利活用と若者のすべて
pyama86
3
2k
その問い、本当に正しいですか?AI時代のエンジニアに必要な哲学と認知科学 / ai-philosophy-cognitive-science
minodriven
6
4k
Featured
See All Featured
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
450
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
330
Odyssey Design
rkendrick25
PRO
2
690
Music & Morning Musume
bryan
47
7.2k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
840
Paper Plane (Part 1)
katiecoart
PRO
0
8.8k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.5k
Docker and Python
trallard
47
3.9k
エンジニアに許された特別な時間の終わり
watany
107
250k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
55k
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 ͓ΘΓ