iT邦幫忙

2022 iThome 鐵人賽

DAY 6
1
自我挑戰組

【從工程師升級成為資深工程師的那檔事】 系列 第 6

【從工程師升級成為資深工程師的那檔事 Day6】SOLID 五大原則 - 依賴反轉原則

  • 分享至 

  • xImage
  •  

這邊已經分享到五大原則中的最後一個了。
如果說開閉原則是物件導向分析(OOA,Object-Oriented Analysis)的核心思想,
那依賴反轉原則(DIP)則可以說是物件導向設計(OOD,Object-Oriented Design)的最高準則(我自己說的)。

這也是當你在應徵資深工程師時最常被問到的技術題之一,
同時也很常跟另外兩個概念一起出現分別是:

  • 依賴注入(DI,Dependency Injection)
  • 控制反轉(IOC,Inversion of Control)

這篇除了會介紹依賴反轉外,也會分別與這兩個改念一起介紹。

定義

High-level modules should not depend on low-level modules. Both should depend on abstractions.
這段話的大意是模組間不應該互相依賴,應該都要依賴抽象(抽象類別/介面)。
而在實際開發中會將可實例化的類別去繼承(extend)抽象類別或是實作(implement)介面
再藉由呼叫*抽象類別/介面來達到各模組間的解偶。

依賴注入(DI) & 控制反轉(IOC)

在說明依賴反轉原則的用途之前,我們先來聊聊依賴注入(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的面試題

在面試很多公司的資深工程師職位時,都會問到IOC 與 DI 有甚麼不同?
我個人認為這是一道很常出現的偽命題。
這兩個名詞出自於Martin Fowler,
也是Martin Fowler對於同一概念在先後做出的不同解釋。
一個偏向設計的思想,另一個則是實作的方法,實際上並沒甚麼不同。
對於開發來說可能只會知道DI,甚至只會知道後面會提到的工廠模式

最後

簡單統整一下我們學到的五大原則

SRP : 進公司後我只幹一件事 (只對一個角色負責)
OCP : 有新的任務,叫其他人做 (不開放修改,開放擴展)
LSP : 組長的位置,換我做也可以 (父型別可以跟派生/子型別替換也不會錯)
ISP : 別定一堆無法達到的KPI (介面定義要有必要性)
DIP : 主管與工程師中間要隔著不做事的傳聲筒 (各模組間都依賴介面)


上一篇
【從工程師升級成為資深工程師的那檔事 Day5】SOLID 五大原則 - 介面隔離原則
下一篇
【從工程師升級成為資深工程師的那檔事 Day7】淺談 OOA與 OOD
系列文
【從工程師升級成為資深工程師的那檔事】 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言