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