這邊已經分享到五大原則中的最後一個了。
如果說開閉原則是物件導向分析(OOA,Object-Oriented Analysis)的核心思想,
那依賴反轉原則(DIP)則可以說是物件導向設計(OOD,Object-Oriented Design)的最高準則(我自己說的)。
這也是當你在應徵資深工程師時最常被問到的技術題之一,
同時也很常跟另外兩個概念一起出現分別是:
這篇除了會介紹依賴反轉外,也會分別與這兩個改念一起介紹。
High-level modules should not depend on low-level modules. Both should depend on abstractions.
這段話的大意是模組間不應該互相依賴,應該都要依賴抽象(抽象類別/介面)。
而在實際開發中會將可實例化的類別去繼承(extend)抽象類別或是實作(implement)介面。
再藉由呼叫*抽象類別/介面來達到各模組間的解偶。
在說明依賴反轉原則的用途之前,我們先來聊聊依賴注入(DI) 和 控制反轉(IOC)。
控制反轉(Inversion of Control)是一種設計概念,與其用字面的意思翻譯,
不如把翻譯成透過某個容器幫忙建立物件。
(翻譯的可能有點不那麼精確,但是利於後面的理解)
至於甚麼是依賴注入(DI)?
以開發上來說就是 別人創建好的物件(Object)傳給我用。
這邊所指的"別人"就是IOC中的容器,或是依賴反轉原則(DIP)中所說的底層模組。
"我" 則是代表DIP中的高層模組(也是用戶端)。
在開發中可以透過三種方式注入:
1.建構式注入(Constructor Injection)
2.屬性注入(Property Injection)
3.方法注入(Method Injection)
依賴反轉原則(DIP)說白了就是一個用處-解耦。
但說了這麼多依賴反轉原則到底為什麼可以解耦?
我們把前面的東西整理成一段話來解釋:
用戶端透過容器取得物件,再利用宣告介面/抽象類別的方式接收
依賴反轉原則(DIP)和控制反轉(IOC)其實都在解釋同一種解耦概念,
而依賴注入(DI)則是一種實作的方式(也有DL、DP、CDL等方式)
在面試很多公司的資深工程師職位時,都會問到IOC 與 DI 有甚麼不同?
我個人認為這是一道很常出現的偽命題。
這兩個名詞出自於Martin Fowler,
也是Martin Fowler對於同一概念在先後做出的不同解釋。
一個偏向設計的思想,另一個則是實作的方法,實際上並沒甚麼不同。
對於開發來說可能只會知道DI,甚至只會知道後面會提到的工廠模式。
簡單統整一下我們學到的五大原則
SRP : 進公司後我只幹一件事 (只對一個角色負責)
OCP : 有新的任務,叫其他人做 (不開放修改,開放擴展)
LSP : 組長的位置,換我做也可以 (父型別可以跟派生/子型別替換也不會錯)
ISP : 別定一堆無法達到的KPI (介面定義要有必要性)
DIP : 主管與工程師中間要隔著不做事的傳聲筒 (各模組間都依賴介面)