SlideShare una empresa de Scribd logo
1 de 20
Descargar para leer sin conexión
Inversion of Control vs.
Dependency Inversion Principle vs.
Dependency Injection
Shih-Peng Lin
2013/12/6
What is Inversion of Control?
• 一種軟體設計技巧;透過在執行時期才將
必須共同運作的軟體元件組合起來執行工
作,以降低程式碼間的coupling與
cohesion。
• 名詞來源
– 最早提到類似此概念的文章為1983年出刊的
“The Mesa Programming Environment”一文。
• 當時稱為“Hollywood Principle”

– 1988年的“Designing Reusable Classes”則是已知
最早使用Inversion of Control此一名詞與對應概
念的文獻。
What is Inversion of Control?
• 只要是符合這項描述的軟體設計模式,都
能稱為Inversion of Control:
– “透過在執行時期才將必須共同運作的軟體元件
組合起來執行工作,以降低程式碼間coupling與
cohesion的軟體設計技巧”
Code in control
Code in inverted control
(Control in windowing system)
More examples
• Behavior of many frameworks
– Spring framework、Android framework、EJB
framework。

• Implementation techniques
– Dependency injection、
– Factory pattern、
– Template pattern、
– Strategy pattern...etc。
In other words...
• Inversion of Control基本上是個高階的抽象
(不是抽象化) 概念與原則,在現代軟體開發
環境中處處可見其蹤影。
What is
Dependency Inversion Principle?
• 由Robert C. Martin所定義:
– High-level modules should not depend on lowlevel modules. Both should depend on
abstractions.
– Abstractions should not depend upon details.
Details should depend upon abstractions.

• 一種透過使高階元件與低階元件以抽象層
協同工作,以降低程式碼耦合度的技巧。
Bad design caused by high coupling
• Rigidity
– 難以對程式碼做更動;因為每一個變動都會影
響到系統中的太多地方。

• Fragility
– 當你做了一項變動,系統中某個意外的部份很
容易毀損。

• Immobility
– 元件很難以在另一個程式中再利用,因為其中
有太多與原程式纏繞的實作部分。
High efferent coupling
Dependency Inversion
More examples
• Plugin mechanism
• Dependency injection
• Adapter pattern
What is Dependency Injection?
• 一種軟體設計模式;移除程式碼中hardcoded的相依性,使該相依性元件能在執行
時期動態地被給予 (注入)。

• 是Dependency Inversion Principle的一種實作
方法。
Highly coupled dependency
Injected dependency (Manually)
Injected dependency (Automatically)
優缺點
• 優點
– 提供使用元件時的彈性;
• 這對unit test來說非常有用,因其可以更容易地注入其他
元件的fake implementation

– 有效隔離元件,讓元件能更符合single responsibility
等原則。

• 缺點
– 隱藏了相依性的細節,讓執行時期錯誤的發生機率
增加,而無法在編譯時期偵測到。
– 由於相依性的隱藏,被注入的元件若做了大幅度的
改變,其使用者必須盡早得知以做出對應修改。
總結
• Inversion of Control是一個高階的抽象概念。
– 不是一個關於“抽象化”的概念,而僅僅是個“抽象
的”概念而已。

• Dependency Inversion Principle是在某些情況下
達成IoC的手段。
– 我們剛好可以把某些元件的行為抽出成為介面來描
述的時候。

• Dependency Injection則是在另一些情況下完成
DIP更具體的實作方式。
– 剛好有某些元件很適合在執行時期才決定要使用的
型別時。
所以...
•
•
•
•

相依性注入就是相依性反轉 X
相依性反轉就是控制反轉 X
相依性注入能達到控制反轉的效果 O
Spring framework (or Grails) 具有控制反轉機
制O
• Android framework裡元件的生命週期
callback methods是控制反轉的一種呈現 O
References
• Martin Fowler (2005). InversionOfControl.
• Martin Fowler (2004). Inversion of Control Containers
and the Dependency Injection pattern.
• Robert C. Martin (1996). The Dependency Inversion
Principle.
• Kyle Baley and Donald Belcham (2010). Brownfield
Application Development in .NET.
• Inversion of control. In Wikipedia. Retrieved Dec. 5
2013.
• Dependency inversion principle. In Wikipedia.
Retrieved Dec. 5 2013.
• Dependency injection. In Wikipedia. Retrieved Dec. 5
2013.

Más contenido relacionado

Similar a Inversion of Control vs. Dependency Inversion Principle vs. Dependency Injection

信息系统开发平台OpenExpressApp
信息系统开发平台OpenExpressApp信息系统开发平台OpenExpressApp
信息系统开发平台OpenExpressAppzhoujg
 
软件设计原则、模式与应用
软件设计原则、模式与应用软件设计原则、模式与应用
软件设计原则、模式与应用yiditushe
 
安卓中的设计模式举例 by hjm1fb
安卓中的设计模式举例 by hjm1fb安卓中的设计模式举例 by hjm1fb
安卓中的设计模式举例 by hjm1fbAlbert Hong
 
Foundation of software development 2
Foundation of software development 2Foundation of software development 2
Foundation of software development 2netdbncku
 
Docker技术介绍
Docker技术介绍Docker技术介绍
Docker技术介绍LI jeanphorn
 
软件工程 第一章
软件工程 第一章软件工程 第一章
软件工程 第一章浒 刘
 
Continuous integration
Continuous integrationContinuous integration
Continuous integrationnetdbncku
 
kotlin-big-nerd-ranch ch4 function
kotlin-big-nerd-ranch ch4 functionkotlin-big-nerd-ranch ch4 function
kotlin-big-nerd-ranch ch4 functionMinHan Hong
 
開放原始碼 Ch2.3 app - oss - ui framewoks (ver 1.0)
開放原始碼 Ch2.3   app - oss - ui framewoks (ver 1.0)開放原始碼 Ch2.3   app - oss - ui framewoks (ver 1.0)
開放原始碼 Ch2.3 app - oss - ui framewoks (ver 1.0)My own sweet home!
 
歡迎加入軟體構築行列
歡迎加入軟體構築行列歡迎加入軟體構築行列
歡迎加入軟體構築行列Chris Wang
 
2017-refactoring-01-簡介
2017-refactoring-01-簡介2017-refactoring-01-簡介
2017-refactoring-01-簡介Shang-Pin Ma
 
第1讲 开始编写程序
第1讲 开始编写程序第1讲 开始编写程序
第1讲 开始编写程序ruandao
 
软件工程 第十一章
软件工程 第十一章软件工程 第十一章
软件工程 第十一章浒 刘
 
Foundation of software development 1
Foundation of software development 1Foundation of software development 1
Foundation of software development 1netdbncku
 
Mvc架构在discuz!插件开发的应用 wps create_msoffice_check
Mvc架构在discuz!插件开发的应用 wps create_msoffice_checkMvc架构在discuz!插件开发的应用 wps create_msoffice_check
Mvc架构在discuz!插件开发的应用 wps create_msoffice_checkCevin Cheung
 
國產操作系統
國產操作系統國產操作系統
國產操作系統Peter Cheung
 
软件构造第一章
软件构造第一章软件构造第一章
软件构造第一章guest58ec466
 
2006 recycle opensourceprojects
2006 recycle opensourceprojects2006 recycle opensourceprojects
2006 recycle opensourceprojectsGeorge Ang
 
Recycle Open Source Projects
Recycle Open Source ProjectsRecycle Open Source Projects
Recycle Open Source ProjectsGeorge Ang
 

Similar a Inversion of Control vs. Dependency Inversion Principle vs. Dependency Injection (20)

信息系统开发平台OpenExpressApp
信息系统开发平台OpenExpressApp信息系统开发平台OpenExpressApp
信息系统开发平台OpenExpressApp
 
软件设计原则、模式与应用
软件设计原则、模式与应用软件设计原则、模式与应用
软件设计原则、模式与应用
 
安卓中的设计模式举例 by hjm1fb
安卓中的设计模式举例 by hjm1fb安卓中的设计模式举例 by hjm1fb
安卓中的设计模式举例 by hjm1fb
 
Foundation of software development 2
Foundation of software development 2Foundation of software development 2
Foundation of software development 2
 
Docker技术介绍
Docker技术介绍Docker技术介绍
Docker技术介绍
 
软件工程 第一章
软件工程 第一章软件工程 第一章
软件工程 第一章
 
Continuous integration
Continuous integrationContinuous integration
Continuous integration
 
kotlin-big-nerd-ranch ch4 function
kotlin-big-nerd-ranch ch4 functionkotlin-big-nerd-ranch ch4 function
kotlin-big-nerd-ranch ch4 function
 
開放原始碼 Ch2.3 app - oss - ui framewoks (ver 1.0)
開放原始碼 Ch2.3   app - oss - ui framewoks (ver 1.0)開放原始碼 Ch2.3   app - oss - ui framewoks (ver 1.0)
開放原始碼 Ch2.3 app - oss - ui framewoks (ver 1.0)
 
歡迎加入軟體構築行列
歡迎加入軟體構築行列歡迎加入軟體構築行列
歡迎加入軟體構築行列
 
2017-refactoring-01-簡介
2017-refactoring-01-簡介2017-refactoring-01-簡介
2017-refactoring-01-簡介
 
第1讲 开始编写程序
第1讲 开始编写程序第1讲 开始编写程序
第1讲 开始编写程序
 
软件工程 第十一章
软件工程 第十一章软件工程 第十一章
软件工程 第十一章
 
Foundation of software development 1
Foundation of software development 1Foundation of software development 1
Foundation of software development 1
 
Mvc架构在discuz!插件开发的应用 wps create_msoffice_check
Mvc架构在discuz!插件开发的应用 wps create_msoffice_checkMvc架构在discuz!插件开发的应用 wps create_msoffice_check
Mvc架构在discuz!插件开发的应用 wps create_msoffice_check
 
Ch03
Ch03Ch03
Ch03
 
國產操作系統
國產操作系統國產操作系統
國產操作系統
 
软件构造第一章
软件构造第一章软件构造第一章
软件构造第一章
 
2006 recycle opensourceprojects
2006 recycle opensourceprojects2006 recycle opensourceprojects
2006 recycle opensourceprojects
 
Recycle Open Source Projects
Recycle Open Source ProjectsRecycle Open Source Projects
Recycle Open Source Projects
 

Último

SymPy 在微積分上的應用_4.pptx SymPy 在微積分上的應用_4.pptx
SymPy 在微積分上的應用_4.pptx SymPy 在微積分上的應用_4.pptxSymPy 在微積分上的應用_4.pptx SymPy 在微積分上的應用_4.pptx
SymPy 在微積分上的應用_4.pptx SymPy 在微積分上的應用_4.pptxNCU MCL
 
买假和真英国驾驶执照买了假的英国驾照,那跟真的有什么区别吗?买假和真正的澳大利亚驾驶执照【微信qoqoqdqd】
买假和真英国驾驶执照买了假的英国驾照,那跟真的有什么区别吗?买假和真正的澳大利亚驾驶执照【微信qoqoqdqd】买假和真英国驾驶执照买了假的英国驾照,那跟真的有什么区别吗?买假和真正的澳大利亚驾驶执照【微信qoqoqdqd】
买假和真英国驾驶执照买了假的英国驾照,那跟真的有什么区别吗?买假和真正的澳大利亚驾驶执照【微信qoqoqdqd】黑客 接单【TG/微信qoqoqdqd】
 
函數畫圖_習題5.pptx 函數畫圖_習題5.pptx 函數畫圖_習題5.pptx
函數畫圖_習題5.pptx 函數畫圖_習題5.pptx 函數畫圖_習題5.pptx函數畫圖_習題5.pptx 函數畫圖_習題5.pptx 函數畫圖_習題5.pptx
函數畫圖_習題5.pptx 函數畫圖_習題5.pptx 函數畫圖_習題5.pptxNCU MCL
 
20161220 - domain-driven design
20161220 - domain-driven design20161220 - domain-driven design
20161220 - domain-driven designJamie (Taka) Wang
 
SymPy 在微積分上的應用_5.pptx SymPy 在微積分上的應用_5.pptx
SymPy 在微積分上的應用_5.pptx SymPy 在微積分上的應用_5.pptxSymPy 在微積分上的應用_5.pptx SymPy 在微積分上的應用_5.pptx
SymPy 在微積分上的應用_5.pptx SymPy 在微積分上的應用_5.pptxNCU MCL
 
20211119 - demystified artificial intelligence with NLP
20211119 - demystified artificial intelligence with NLP20211119 - demystified artificial intelligence with NLP
20211119 - demystified artificial intelligence with NLPJamie (Taka) Wang
 
函數微分_習題4.pptx 函數微分_習題4.pptx 函數微分_習題4.pptx
函數微分_習題4.pptx 函數微分_習題4.pptx 函數微分_習題4.pptx函數微分_習題4.pptx 函數微分_習題4.pptx 函數微分_習題4.pptx
函數微分_習題4.pptx 函數微分_習題4.pptx 函數微分_習題4.pptxNCU MCL
 
函數畫圖_習題7.pptx 函數畫圖_習題7.pptx 函數畫圖_習題7.pptx
函數畫圖_習題7.pptx 函數畫圖_習題7.pptx 函數畫圖_習題7.pptx函數畫圖_習題7.pptx 函數畫圖_習題7.pptx 函數畫圖_習題7.pptx
函數畫圖_習題7.pptx 函數畫圖_習題7.pptx 函數畫圖_習題7.pptxNCU MCL
 
函數畫圖_習題6.pptx 函數畫圖_習題6.pptx 函數畫圖_習題6.pptx
函數畫圖_習題6.pptx 函數畫圖_習題6.pptx 函數畫圖_習題6.pptx函數畫圖_習題6.pptx 函數畫圖_習題6.pptx 函數畫圖_習題6.pptx
函數畫圖_習題6.pptx 函數畫圖_習題6.pptx 函數畫圖_習題6.pptxNCU MCL
 
20170104 - transaction_pattern
20170104 - transaction_pattern20170104 - transaction_pattern
20170104 - transaction_patternJamie (Taka) Wang
 

Último (15)

SymPy 在微積分上的應用_4.pptx SymPy 在微積分上的應用_4.pptx
SymPy 在微積分上的應用_4.pptx SymPy 在微積分上的應用_4.pptxSymPy 在微積分上的應用_4.pptx SymPy 在微積分上的應用_4.pptx
SymPy 在微積分上的應用_4.pptx SymPy 在微積分上的應用_4.pptx
 
20151111 - IoT Sync Up
20151111 - IoT Sync Up20151111 - IoT Sync Up
20151111 - IoT Sync Up
 
买假和真英国驾驶执照买了假的英国驾照,那跟真的有什么区别吗?买假和真正的澳大利亚驾驶执照【微信qoqoqdqd】
买假和真英国驾驶执照买了假的英国驾照,那跟真的有什么区别吗?买假和真正的澳大利亚驾驶执照【微信qoqoqdqd】买假和真英国驾驶执照买了假的英国驾照,那跟真的有什么区别吗?买假和真正的澳大利亚驾驶执照【微信qoqoqdqd】
买假和真英国驾驶执照买了假的英国驾照,那跟真的有什么区别吗?买假和真正的澳大利亚驾驶执照【微信qoqoqdqd】
 
20200226 - AI Overview
20200226 - AI Overview20200226 - AI Overview
20200226 - AI Overview
 
函數畫圖_習題5.pptx 函數畫圖_習題5.pptx 函數畫圖_習題5.pptx
函數畫圖_習題5.pptx 函數畫圖_習題5.pptx 函數畫圖_習題5.pptx函數畫圖_習題5.pptx 函數畫圖_習題5.pptx 函數畫圖_習題5.pptx
函數畫圖_習題5.pptx 函數畫圖_習題5.pptx 函數畫圖_習題5.pptx
 
20161220 - domain-driven design
20161220 - domain-driven design20161220 - domain-driven design
20161220 - domain-driven design
 
Entities in DCPS (DDS)
Entities in DCPS (DDS)Entities in DCPS (DDS)
Entities in DCPS (DDS)
 
SymPy 在微積分上的應用_5.pptx SymPy 在微積分上的應用_5.pptx
SymPy 在微積分上的應用_5.pptx SymPy 在微積分上的應用_5.pptxSymPy 在微積分上的應用_5.pptx SymPy 在微積分上的應用_5.pptx
SymPy 在微積分上的應用_5.pptx SymPy 在微積分上的應用_5.pptx
 
20211119 - demystified artificial intelligence with NLP
20211119 - demystified artificial intelligence with NLP20211119 - demystified artificial intelligence with NLP
20211119 - demystified artificial intelligence with NLP
 
20200323 - AI Intro
20200323 - AI Intro20200323 - AI Intro
20200323 - AI Intro
 
函數微分_習題4.pptx 函數微分_習題4.pptx 函數微分_習題4.pptx
函數微分_習題4.pptx 函數微分_習題4.pptx 函數微分_習題4.pptx函數微分_習題4.pptx 函數微分_習題4.pptx 函數微分_習題4.pptx
函數微分_習題4.pptx 函數微分_習題4.pptx 函數微分_習題4.pptx
 
函數畫圖_習題7.pptx 函數畫圖_習題7.pptx 函數畫圖_習題7.pptx
函數畫圖_習題7.pptx 函數畫圖_習題7.pptx 函數畫圖_習題7.pptx函數畫圖_習題7.pptx 函數畫圖_習題7.pptx 函數畫圖_習題7.pptx
函數畫圖_習題7.pptx 函數畫圖_習題7.pptx 函數畫圖_習題7.pptx
 
函數畫圖_習題6.pptx 函數畫圖_習題6.pptx 函數畫圖_習題6.pptx
函數畫圖_習題6.pptx 函數畫圖_習題6.pptx 函數畫圖_習題6.pptx函數畫圖_習題6.pptx 函數畫圖_習題6.pptx 函數畫圖_習題6.pptx
函數畫圖_習題6.pptx 函數畫圖_習題6.pptx 函數畫圖_習題6.pptx
 
20161027 - edge part2
20161027 - edge part220161027 - edge part2
20161027 - edge part2
 
20170104 - transaction_pattern
20170104 - transaction_pattern20170104 - transaction_pattern
20170104 - transaction_pattern
 

Inversion of Control vs. Dependency Inversion Principle vs. Dependency Injection

  • 1. Inversion of Control vs. Dependency Inversion Principle vs. Dependency Injection Shih-Peng Lin 2013/12/6
  • 2. What is Inversion of Control? • 一種軟體設計技巧;透過在執行時期才將 必須共同運作的軟體元件組合起來執行工 作,以降低程式碼間的coupling與 cohesion。 • 名詞來源 – 最早提到類似此概念的文章為1983年出刊的 “The Mesa Programming Environment”一文。 • 當時稱為“Hollywood Principle” – 1988年的“Designing Reusable Classes”則是已知 最早使用Inversion of Control此一名詞與對應概 念的文獻。
  • 3. What is Inversion of Control? • 只要是符合這項描述的軟體設計模式,都 能稱為Inversion of Control: – “透過在執行時期才將必須共同運作的軟體元件 組合起來執行工作,以降低程式碼間coupling與 cohesion的軟體設計技巧”
  • 5. Code in inverted control (Control in windowing system)
  • 6. More examples • Behavior of many frameworks – Spring framework、Android framework、EJB framework。 • Implementation techniques – Dependency injection、 – Factory pattern、 – Template pattern、 – Strategy pattern...etc。
  • 7. In other words... • Inversion of Control基本上是個高階的抽象 (不是抽象化) 概念與原則,在現代軟體開發 環境中處處可見其蹤影。
  • 8. What is Dependency Inversion Principle? • 由Robert C. Martin所定義: – High-level modules should not depend on lowlevel modules. Both should depend on abstractions. – Abstractions should not depend upon details. Details should depend upon abstractions. • 一種透過使高階元件與低階元件以抽象層 協同工作,以降低程式碼耦合度的技巧。
  • 9. Bad design caused by high coupling • Rigidity – 難以對程式碼做更動;因為每一個變動都會影 響到系統中的太多地方。 • Fragility – 當你做了一項變動,系統中某個意外的部份很 容易毀損。 • Immobility – 元件很難以在另一個程式中再利用,因為其中 有太多與原程式纏繞的實作部分。
  • 12. More examples • Plugin mechanism • Dependency injection • Adapter pattern
  • 13. What is Dependency Injection? • 一種軟體設計模式;移除程式碼中hardcoded的相依性,使該相依性元件能在執行 時期動態地被給予 (注入)。 • 是Dependency Inversion Principle的一種實作 方法。
  • 17. 優缺點 • 優點 – 提供使用元件時的彈性; • 這對unit test來說非常有用,因其可以更容易地注入其他 元件的fake implementation – 有效隔離元件,讓元件能更符合single responsibility 等原則。 • 缺點 – 隱藏了相依性的細節,讓執行時期錯誤的發生機率 增加,而無法在編譯時期偵測到。 – 由於相依性的隱藏,被注入的元件若做了大幅度的 改變,其使用者必須盡早得知以做出對應修改。
  • 18. 總結 • Inversion of Control是一個高階的抽象概念。 – 不是一個關於“抽象化”的概念,而僅僅是個“抽象 的”概念而已。 • Dependency Inversion Principle是在某些情況下 達成IoC的手段。 – 我們剛好可以把某些元件的行為抽出成為介面來描 述的時候。 • Dependency Injection則是在另一些情況下完成 DIP更具體的實作方式。 – 剛好有某些元件很適合在執行時期才決定要使用的 型別時。
  • 19. 所以... • • • • 相依性注入就是相依性反轉 X 相依性反轉就是控制反轉 X 相依性注入能達到控制反轉的效果 O Spring framework (or Grails) 具有控制反轉機 制O • Android framework裡元件的生命週期 callback methods是控制反轉的一種呈現 O
  • 20. References • Martin Fowler (2005). InversionOfControl. • Martin Fowler (2004). Inversion of Control Containers and the Dependency Injection pattern. • Robert C. Martin (1996). The Dependency Inversion Principle. • Kyle Baley and Donald Belcham (2010). Brownfield Application Development in .NET. • Inversion of control. In Wikipedia. Retrieved Dec. 5 2013. • Dependency inversion principle. In Wikipedia. Retrieved Dec. 5 2013. • Dependency injection. In Wikipedia. Retrieved Dec. 5 2013.