依賴倒轉(zhuǎn)原則(Dependency Inversion Principle, DIP):抽象不應(yīng)該依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)當(dāng)依賴于抽象。換言之,要針對(duì)抽象(接口)編程,而不是針對(duì)實(shí)現(xiàn)細(xì)節(jié)編程。
開(kāi)閉原則(OCP)是面向?qū)ο笤O(shè)計(jì)原則的基礎(chǔ)也是整個(gè)設(shè)計(jì)的一個(gè)終極目標(biāo),而依賴倒置原則(DIP )則是實(shí)現(xiàn)OCP原則的一個(gè)基礎(chǔ),換句話說(shuō)開(kāi)閉原則(OCP)是你蓋一棟大樓的設(shè)計(jì)藍(lán)圖,那么依賴倒置原則就是蓋這棟大樓的一個(gè)鋼構(gòu)框架,沒(méi)有鋼構(gòu)架構(gòu)是很難順利蓋起一棟大樓的,同樣的在面向?qū)ο筌浖O(shè)計(jì)的過(guò)程中不遵守依賴倒置原則是很難開(kāi)發(fā)出符合開(kāi)閉原則的軟件的。更不用說(shuō)開(kāi)發(fā)出易于維護(hù),易于升級(jí)的軟件。 因此開(kāi)閉原則是非常重要的一個(gè)原則,它有很強(qiáng)的實(shí)操性,并且能夠直接指導(dǎo)我們寫(xiě)代碼代碼。
通常要符合這個(gè)原則的第一步就是針對(duì)抽象編程,類之間的依賴關(guān)系盡量去使用高層抽象不要使用底層的實(shí)現(xiàn)細(xì)節(jié),從軟件工程來(lái)說(shuō)高層抽象是較穩(wěn)定的,也就是說(shuō)抽象具有一定的穩(wěn)定性,而實(shí)現(xiàn)細(xì)節(jié)較不穩(wěn)定,也就是說(shuō)實(shí)現(xiàn)細(xì)節(jié)具有易變性,而我們期望軟件具有更好的穩(wěn)定性,顯而易見(jiàn)我們?cè)陂_(kāi)發(fā)的時(shí)候自然而然的要走穩(wěn)定路線(依賴抽象編程)。這個(gè)原則也是對(duì)軟件工程中要求“高聚低偶”實(shí)踐一個(gè)保障和指導(dǎo)。
我們來(lái)看一個(gè)例子假設(shè)我們?cè)陂_(kāi)發(fā)一個(gè)軟件產(chǎn)品需要一個(gè)日志系統(tǒng),要將系統(tǒng)產(chǎn)生的一些重要事情記錄在記事本上。通常我們的實(shí)現(xiàn)如下:
public class Logger { public void Info(string infoText) { Console.WriteLine($"[{DateTime.Now}][Info]:{infoText}"); } public void Debug(string debugText) { Console.WriteLine($"[{DateTime.Now}][Debug]:{debugText}"); } public void Warn(string warmText) { Console.WriteLine($"[{DateTime.Now}][Warm]:{warmText}"); } public void Error(string errorText,Exception exception) { Console.WriteLine($"[{DateTime.Now}][Error]:{errorText} - Exception:{exception.Message}");