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
使用 Meilisearch 建立新聞搜尋工具
johnroyer
0
100
エンジニアにデザインハーネスを 〜デザインプロセスを規定するためのハーネス〜 / Design harness from an engineer's perspective
rkaga
2
990
AI駆動開発を妨げる技術的負債の解消アプローチ / ai-refactoring-approach
minodriven
17
8.7k
エージェンティックRAGにAWSで入門しよう!
har1101
9
1.9k
コーディングルールの鮮度を保ちたい for SRE NEXT 2026 / keep-fresh-go-internal-conventions-sre-next-2026
handlename
0
120
SREは、MCPとSRE Agentをこう使え!
kazumax55
0
140
Embedded SREと共に達成した会員管理システムのAWS移行 - SRE NEXT 2026 ランチスポンサーセッション
niftycorp
PRO
0
1.4k
ローカルLLMでどこまでコードが書けるか -拡張版 / How much code can be written on a local LLM Extended
kishida
12
4.6k
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
snhryt
0
210
エンジニアと一緒にテストコードの設計と実装を改善した話
mototakatsu
0
250
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
830
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
830
Featured
See All Featured
The Mindset for Success: Future Career Progression
greggifford
PRO
0
410
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.2k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
380
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
300
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
490
Music & Morning Musume
bryan
47
7.3k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.3k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
380
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
180
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Embracing the Ebb and Flow
colly
88
5.1k
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 ͓ΘΓ