依賴倒置原則(dependence inversion principle or dip)
該文章的最新版本已遷移至個人部落格【位元飛】,單擊鏈結 訪問。
高層模組不應該依賴低層模組,他們都應該依賴於抽象;抽象不應該依賴於細節,細節應該依賴於抽象。
簡單的定義為:面向介面(抽象)程式設計,不要面向實現程式設計。
dip:high level modules should not depend upon low level modules,both should depend upon abstractions.abstractions should not depend upon details.details should depend upon abstracts.
program to an inte***ce, not an implementation.
什麼是高層模組?簡單地說,就是封裝的層級高,我們就認為其是高層模組。customer類是乙個客戶類,該客戶包含unlockphone解鎖手機方法,該方法需要傳遞乙個xiaomiphone的手機類以便解鎖手機,那麼customer類就是高層模組,xiaomiphone類就是低層模組。
什麼是細節?細節就是例項方法,是乙個完整的、足夠小的邏輯單元,是一段包含**的子程式。什麼是抽象?在c#中,抽象就是抽象類(準確地說,應該是抽象類中的抽象方法,因為抽象類中可以包含例項方法)或介面,他們都無法被直接例項化,只能通過抽象類的子類、介面的實現類或工廠方法提供例項(容器也可以提供例項,但其本質上仍是工廠)。實際上抽象根本無法依賴細節,因為c#語法規定,抽象方法和介面無法包含實現,即不可能包含細節,這就是「抽象不應該依賴細節」。那麼什麼是「細節應該依賴抽象」呢?細節應該依賴抽象可以認為是黎克特制替換原則的公升級版,它要求盡可能的使用抽象基類或介面作為方法的引數。
示例:
public class xiaomiphone
public class customer
var customer = new customer();
var phone = new xiaomiphone();
var lockresult = customer.unlockphone(phone);
通過上面的**我們可以明顯看到,高層模組customer類嚴重依賴低層模組xiaomiphone類,因為unlockphone方法需要乙個xiaomiphone類的引數,這種強依賴關係導致的乙個後果是,無論修改了customer類還是xiaomiphone類,都無法保證呼叫方一定可以正確執行,我們需要對這2個類做完整的回歸測試。另外乙個問題是,有一天我們想解鎖iphonex,將要對以上**進行大規模的修改,這顯然違背了開閉原則。以下給出乙個解決方案以供參考:
public inte***ce imobilephone
public class xiaomiphone : imobilephone
}
public bool unlock()
}
public class customer
var customer = new customer();
imobilephone phone = new xiaomiphone();
var lockresult = customer.unlockphone(phone);
lockresult = customer.unlockphone(phone);
通過上面的分析我們不難發現,本來高層模組依賴低層模組,經過**改造後,變成了它們都依賴於抽象,即依賴發生了轉移,這就是所謂的「依賴倒置原則」。實現依賴倒置的方式稱為依賴注入(dependency injection),常見的依賴注入方式有3種,構造注入,設值注入、介面注入。
構造注入:
public class customer
public bool unlockphone() => _phone.unlock();
}
設值注入:
public class customer
public bool unlockphone() => phone.unlock();
}
介面注入:
inte***ce iphoneprovider
}
public inte***ce imobilephone
public class custome : iphoneprovider
public bool unlockphone() => phone.unlock();
}
綜上所述,我們不難得到結論,注入是手段,依賴倒置是目的。
該文章的最新版本已遷移至個人部落格【位元飛】,單擊鏈結 訪問。
依賴倒置原則 物件導向設計原則之依賴倒置原則
依賴倒置原則的定義 依賴倒置原則 dependence inversion principle,dip 是 object mentor 公司總裁羅伯特 馬丁 robert c.martin 於 1996 年在 c report 上發表的文章。依賴倒置原則的原始定義為 高層模組不應該依賴低層模組,兩者...
物件導向設計原則 依賴倒置原則
依賴倒置原則 dependence inversion principle,dip 依賴倒置原則的原始定義為 高層模組不應該依賴低層模組,兩者都應該依賴其抽象 抽象不應該依賴細節,細節應該依賴抽象。其核心思想是 要面向介面程式設計,不要面向實現程式設計。依賴倒置原則是實現開閉原則的重要途徑之一,它降...
物件導向設計原則四 依賴倒置原則
依賴倒置原則 dip 定義 高層模組不應該依賴底層模組,兩者都應該依賴其抽象 抽象不應該依賴細節 細節應該依賴抽象。好處 穩定性 可維護性 可擴充套件性。概述 di就是依賴倒置的意思,也可稱為控制反轉,我們以前編寫結構化的程式當中,也就是c語言這樣的語言時,高層模組依賴於底層模組,也就是呼叫者和被呼...