1.2.2 S.O.L.I.D.設(shè)計(jì)原則
S.O.L.I.D.設(shè)計(jì)原則是一組針對(duì)面向?qū)ο笤O(shè)計(jì)的最佳實(shí)踐。GoF設(shè)計(jì)模式均以這樣或那樣的形式遵守這些原則。術(shù)語(yǔ)S.O.L.I.D.來(lái)自于Robert C. Martin(朋友們親切地稱(chēng)呼他Bob大叔)的著作Agile Principles, Patterns, and Practices in C#中收集的5個(gè)設(shè)計(jì)原則的名稱(chēng)的首字母。下面將依次介紹這些設(shè)計(jì)原則。
1. 單一責(zé)任原則(SRP)
SRP原則與SoC原則保持高度一致。它要求每個(gè)對(duì)象只應(yīng)該為一個(gè)元素而改變而且只有一個(gè)職責(zé)關(guān)注點(diǎn)。遵循這個(gè)原則,就可以避免單體類(lèi)(就像是軟件領(lǐng)域的瑞士軍刀)設(shè)計(jì)問(wèn)題。使每個(gè)類(lèi)均保持簡(jiǎn)潔,就可以提升系統(tǒng)的可讀性和可維護(hù)性。
2. 開(kāi)放封閉原則(OCP)
OCP原則要求類(lèi)對(duì)于擴(kuò)展應(yīng)該是開(kāi)放的,而對(duì)于修改應(yīng)該是封閉的,這樣應(yīng)該就能夠在不改變類(lèi)的內(nèi)部行為的情況下添加新功能并擴(kuò)展類(lèi)。這個(gè)原則努力避免破壞已有的類(lèi)以及其他依賴(lài)它的類(lèi),因?yàn)檫@會(huì)在應(yīng)用程序中造成bug和錯(cuò)誤的漣漪效應(yīng)。
3. 里氏替換原則(LSP)
LSP原則指出應(yīng)該能夠使用任何繼承類(lèi)來(lái)替代父類(lèi)并且讓其行為方式保持不變。這個(gè)原則與OCP原則保持一致:它確保繼承類(lèi)不會(huì)影響父類(lèi)的行為,換句話(huà)來(lái)說(shuō),繼承類(lèi)必須可替代它們的基類(lèi)。
4. 接口分離原則(ISP)
ISP原則關(guān)注的是將契約的方法劃分成若干職責(zé)分組,并且為這些分組指派不同的接口,這樣客戶(hù)端就不需要實(shí)現(xiàn)一個(gè)龐大的接口和一堆它們并不使用的方法。這個(gè)原則背后的目的是:使用相同接口的類(lèi)只需要實(shí)現(xiàn)特定的一組方法,而不是實(shí)現(xiàn)一個(gè)龐大的單體方法接口。
5. 依賴(lài)倒置原則(DIP)
DIP原則的宗旨是將自己編寫(xiě)的類(lèi)與具體的實(shí)現(xiàn)隔離開(kāi)來(lái),讓這些類(lèi)依賴(lài)于抽象類(lèi)或接口。它提倡面向接口(而不是實(shí)現(xiàn))編程,這確保代碼不會(huì)與某種實(shí)現(xiàn)緊密耦合,從而提高了系統(tǒng)的靈活性。
6. 依賴(lài)注入(DI)和控制反轉(zhuǎn)(IoC)原則
與DIP緊密相關(guān)的是DI原則和IoC原則。DI通過(guò)構(gòu)造器、方法或?qū)傩詠?lái)提供底層類(lèi)或從屬類(lèi)。配合使用DI原則,這些從屬類(lèi)可以被反轉(zhuǎn)為接口或抽象類(lèi),這樣就可以形成一個(gè)具有較高的可測(cè)試性和易于修改的松散耦合系統(tǒng)。
在IoC原則中,系統(tǒng)的控制流與過(guò)程式編程方法相比是反轉(zhuǎn)的。這個(gè)原則的一個(gè)示例是IoC容器,它的作用是將服務(wù)注入到客戶(hù)端代碼,而不必讓客戶(hù)端代碼指定具體的實(shí)現(xiàn)。在該實(shí)例中,控制反轉(zhuǎn)指的是客戶(hù)端獲取服務(wù)的行為。
本書(shū)中,將更詳細(xì)地研究每個(gè)S.O.L.I.D.原則。但接下來(lái),將探討一些專(zhuān)門(mén)用來(lái)處理特殊情況的企業(yè)級(jí)模式,它們以常見(jiàn)設(shè)計(jì)原則和設(shè)計(jì)模式為基礎(chǔ)構(gòu)建。