Inversion of Control vs.
Dependency Inversion Principle vs.
Dependency Injection
Shih-Peng Lin
2013/12/6
What is Inversion of Control?
• 一種軟體設計技巧;透過在執行時期才將
必須共同運作的軟體元件組合起來執行工
作,以降低程式碼間的coupling與
cohesion。
• 名詞來源
– 最早提到類似此概念的文章為...
What is Inversion of Control?
• 只要是符合這項描述的軟體設計模式,都
能稱為Inversion of Control:
– “透過在執行時期才將必須共同運作的軟體元件
組合起來執行工作,以降低程式碼間coupli...
Code in control
Code in inverted control
(Control in windowing system)
More examples
• Behavior of many frameworks
– Spring framework、Android framework、EJB
framework。

• Implementation techniqu...
In other words...
• Inversion of Control基本上是個高階的抽象
(不是抽象化) 概念與原則,在現代軟體開發
環境中處處可見其蹤影。
What is
Dependency Inversion Principle?
• 由Robert C. Martin所定義:
– High-level modules should not depend on lowlevel modules...
Bad design caused by high coupling
• Rigidity
– 難以對程式碼做更動;因為每一個變動都會影
響到系統中的太多地方。

• Fragility
– 當你做了一項變動,系統中某個意外的部份很
容易毀損。...
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的手段。
...
所以...
•
•
•
•

相依性注入就是相依性反轉 X
相依性反轉就是控制反轉 X
相依性注入能達到控制反轉的效果 O
Spring framework (or Grails) 具有控制反轉機
制O
• Android framework裡...
References
• Martin Fowler (2005). InversionOfControl.
• Martin Fowler (2004). Inversion of Control Containers
and the Dep...
Upcoming SlideShare
Loading in …5
×

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

951 views

Published on

A brief introduction to what is Inversion of Control, Dependency Inversion Principle, and Dependency Injection.

Published in: Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
951
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
15
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

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

×