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
Koji Saiki
October 30, 2017
Programming
820
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
160
いまどきのSIer的品質向上
kojisaiki
0
180
誰も教えてくれなかったSEとしてただ一つ必要なこと
kojisaiki
0
480
なぜ誰もこう書いてくれない Dependency Injection
kojisaiki
5
1.9k
Other Decks in Programming
See All in Programming
設計次第でAIコードの読む量は減らせる / designing-for-code-reading
minodriven
35
17k
AI-Powered Domain-Driven Design
ziobrando
0
290
우리의 Nitro Modules는 당신의 Turbo Modules보다 아름답다
l2hyunwoo
0
190
Domain-Driven Transformation
hschwentner
2
2.3k
golang-bob.pdf
iwatsukayura
0
140
ChromeでローカルLLM
ryu1013
0
160
sbt 2.0: takeoff
eed3si9n
0
170
気持ちぃ〜角丸 Squircle
ryu1013
0
330
Apple Intelligenceとオンデバイス時代の到来
yahir0
0
100
Kotlinize Is Not Just Converting to Kotlin
chigichan24
1
190
現場と育てるRailsモデリング 〜Spreadsheetから始めたモデル設計〜
siroemk
2
920
AI時代のTerminal環境を UNIX哲学で設計・運用する
yasunori0418
1
210
Featured
See All Featured
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.6k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
590
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
320
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.7k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
630
Crafting Experiences
bethany
1
390
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
1k
HDC tutorial
michielstock
2
970
Designing Experiences People Love
moore
143
24k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
12k
Accessibility Awareness
sabderemane
1
260
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.2k
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 ͓ΘΓ