依賴注入新手指南:白話解釋依賴注入、控制反轉與依賴反轉原則背後的核心思想
前情提要:
我剛開始學 DI、IoC 和 DIP 的時候,查了不少文章,但大多一上來就塞滿了什麼「依賴啦」、「耦合啦」、「抽象啦」,還有「高低階模組」、「容器」、「注入」這些 OOP 的專業詞彙。對於剛接觸 OOP 或對 OOP 不太熟悉的人(比如我)來說著實不太友善。連這些詞彙是什麼意思都還沒搞清楚,就要用它們來理解 DI、IoC 和 DIP,實在有點太難了。本篇文章的目標是讓對 OOP 與 Design Pattern 不熟悉的人也能對以上三個觀念建立清楚的理解。因此,在這篇文章的開頭,我想要用最簡單易懂的方式帶大家先建立對 DI、IoC 和 DIP 的基本概念,讓大家掌握它們背後的核心思想,而不被繁雜的專業術語困擾。接下來的章節中,我們會逐步深入,探討這些術語和技術細節,以便完整理解這些設計原則。
快速認識依賴注入 (DI)、控制反轉 (IoC)、依賴反轉原則 (DIP)
S.O.L.I.D 軟體架構中的 D 所代表的就是依賴反轉原則 (Dependency Inversion Principle, DIP) ,在物件導向設計 (OOD) 中是個非常重要的設計原則。這個原則與我們經常提到的控制反轉 (Inversion of Control, IoC) 和 依賴注入 (Dependency Injection, DI) 緊密相關,這些概念共同構成了一個強大且靈活的架構基礎。
-
DIP - Dependency Inversion Principle (依賴反轉原則)
想像你是一位經營餐廳的主廚,而食材的供應非常重要。如果你依賴某一家固定的農場供應食材,那麼如果這個農場關閉或供應中斷,你的餐廳運營就會受到影響。依賴反轉原則告訴你,不要依賴某一家具體的農場,而是應該依賴於“供應商的概念”。也就是說,你應該和一個供應系統合作,這樣無論哪家供應商提供食材,你都能正常運營。
DIP 是一種軟體架構的設計原則與思想,強調高階模組不應該依賴具體的低階模組,而是依賴抽象的接口或契約。這樣可以輕鬆替換具體的實作,系統的可擴展性和穩定性也會更好。
-
IoC - Inversion of Control (控制反轉)
接著看控制反轉,想像如果你是一個廚師,傳統上你可能自己去菜市場選購食材,然後每天回來準備料理。但控制反轉的概念告訴你,讓“供應商”替你負責這件事。他們知道你每天需要什麼,會自動送來。這樣,你的控制權不再在你手中,而是交給了外部的供應商,讓他們負責供應流程。你只需要專心做菜。
IoC 是一種 DIP 的具體實踐方式,它的核心在於,將控制物件的創建和依賴的管理交給外部容器或框架,讓框架來管理這些過程,讓程式模組更專注於各自的功能。
-
DI - Dependency Injection (依賴注入)