物件導向設計原則之依賴倒轉原則

2021-07-22 12:20:07 字數 2681 閱讀 7139

如果說開閉原則是物件導向設計的目標的話,那麼依賴倒轉原則就是物件導向設計的主要實現機制之一,它是系統抽象化的具體實現。依賴倒轉原則是robert c. martin在2023年為「c++reporter」所寫的專欄engineering notebook的第三篇,後來加入到他在2023年出版的經典著作「agile software development, principles, patterns, and practices」一書中。依賴倒轉原則定義如下:

依賴倒轉原則(dependency inversion  principle, dip):抽象不應該依賴於細節,細節應當依賴於抽象。換言之,要針對介面程式設計,而不是針對實現程式設計。

依賴倒轉原則要求我們在程式**中傳遞引數時或在關聯關係中,盡量引用層次高的抽象層類,即使用介面和抽象類進行變數型別宣告、引數型別宣告、方法返回型別宣告,以及資料型別的轉換等,而不要用具體類來做這些事情。為了確保該原則的應用,乙個具體類應當只實現介面或抽象類中宣告過的方法,而不要給出多餘的方法,否則將無法呼叫到在子類中增加的新方法。

在引入抽象層後,系統將具有很好的靈活性,在程式中盡量使用抽象層進行程式設計,而將具體類寫在配置檔案中,這樣一來,如果系統行為發生變化,只需要對抽象層進行擴充套件,並修改配置檔案,而無須修改原有系統的源**,在不修改的情況下來擴充套件系統的功能,滿足開閉原則的要求。

在實現依賴倒轉原則時,我們需要針對抽象層程式設計,而將具體類的物件通過依賴注入(dependencyinjection, di)的方式注入到其他物件中,依賴注入是指當乙個物件要與其他物件發生依賴關係時,通過抽象來注入所依賴的物件。常用的注入方式有三種,分別是:構造注入,設值注入(setter注入)和介面注入。構造注入是指通過建構函式來傳入具體類的物件,設值注入是指通過setter方法來傳入具體類的物件,而介面注入是指通過在介面中宣告的業務方法來傳入具體類的物件。這些方法在定義時使用的是抽象型別,在執行時再傳入具體型別的物件,由子類物件來覆蓋父類物件。

擴充套件

軟體工程大師martin fowler在其文章inversion of    control containers and the dependency injection pattern

下面通過乙個簡單例項來加深對依賴倒轉原則的理解:

sunny軟體公司開發人員在開發某crm系統時發現:該系統經常需要將儲存在txt或excel檔案中的客戶資訊轉存到資料庫中,因此需要進行資料格式轉換。在客戶資料操作類中將呼叫資料格式轉換類的方法實現格式轉換和資料庫插入操作,初始設計方案結構如圖1所示:

圖1 初始設計方案結構圖

在編碼實現圖1所示結構時,sunny軟體公司開發人員發現該設計方案存在乙個非常嚴重的問題,由於每次轉換資料時資料**不一定相同,因此需要更換資料轉換類,如有時候需要將txtdataconvertor改為exceldataconvertor,此時,需要修改customerdao的源**,而且在引入並使用新的資料轉換類時也不得不修改customerdao的源**,系統擴充套件性較差,違反了開閉原則,現需要對該方案進行重構。

在本例項中,由於customerdao針對具體資料轉換類程式設計,因此在增加新的資料轉換類或者更換資料轉換類時都不得不修改customerdao的源**。我們可以通過引入抽象資料轉換類解決該問題,在引入抽象資料轉換類dataconvertor之後,customerdao針對抽象類dataconvertor程式設計,而將具體資料轉換類名儲存在配置檔案中,符合依賴倒轉原則。根據黎克特制代換原則,程式執行時,具體資料轉換類物件將替換dataconvertor型別的物件,程式不會出現任何問題。更換具體資料轉換類時無須修改源**,只需要修改配置檔案;如果需要增加新的具體資料轉換類,只要將新增資料轉換類作為dataconvertor的子類並修改配置檔案即可,原有**無須做任何修改,滿足開閉原則。重構後的結構如圖2所示:

圖2重構後的結構圖

在上述重構過程中,我們使用了開閉原則、黎克特制代換原則和依賴倒轉原則,在大多數情況下,這三個設計原則會同時出現,開閉原則是目標,黎克特制代換原則是基礎,依賴倒轉原則是手段,它們相輔相成,相互補充,目標一致,只是分析問題時所站角度不同而已。

擴充套件

robert c. martin(bob大叔):object mentor公司總裁,物件導向設計、模式、uml、敏捷方法學和極限程式設計領域內的資深顧問。

再上兩張bob大叔的「玉照」,

物件導向設計原則之依賴倒轉原則

如果說開閉原則是物件導向設計的目標的話,那麼依賴倒轉原則就是物件導向設計的主要實現機制之一,它是系統抽象化的具體實現。依賴倒轉原則是robert c.martin在1996年為 c reporter 所寫的專欄engineering notebook的第三篇,後來加入到他在2002年出版的經典著作 ...

物件導向設計原則之依賴倒轉原則

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!如果說開閉原則是物件導向設計的目標的話,那麼依賴倒轉原則就是物件導向設計的主要實現機制之一,它是系統抽象化的具體實現。依賴倒轉原則是robert c.martin在1996年為 c reporter 所寫的專欄engineering noteboo...

物件導向設計原則之依賴倒轉原則

依賴倒轉原則 dependence inversion principle,dip 的定義 高層模組不應該依賴於低層模組,它們都應該依賴於抽象。抽象不應該依賴於細節,細節應該依賴於抽象。另一種表述 要針對介面程式設計,不要針對實現程式設計。對各種概念進行乙個描述 依賴倒置原則的優點 參考自設計模式六...