設計模式(4)設計模式的基本原則(下)SOLID 原則
## SOLID 原則
SOLID 是一個縮寫,每個字母代表一個準則,是由羅伯特·C·馬?。≧obert C. Martin)在 2000 年代初提出的一組面向對象設計的指導原則。
1. **單一職責原則 (Single Responsibility Principle, SRP)**
當代碼的復雜性增加時,我們需要將代碼分解成更小的部分,將它們按照不同的職責進行組織。
每個類應該只負責一項職責,引起它變化的原因也應該只有一個。
這樣不僅可以減少復雜度,還可以在變更時降低影響范圍。
2. **開放封閉原則 (Open Closed Principle, OCP)**
對擴展開放,對修改關閉。
如果一個類已經(jīng)完成了其既定的職責,當需求發(fā)生變化時,應該通過擴展的方式來應對變化,而不是修改原有的代碼。
開放封閉原則強調(diào)通過抽象來實現(xiàn)擴展,因此需要在設計中充分考慮抽象角色的定義。
抽象接口或基類應該明確描述出可以擴展的行為,而具體的實現(xiàn)則可以在需要的時候進行擴展。
開放封閉原則不能應用于所有對類進行的修改中,如果類本身有問題,修改是必要的。
3. **里氏替換原則 (Liskov Substitution Principle, LSP)**
里氏替換原則是由麻省理工學院計算機科學實驗室的里斯科夫(Liskov)女士在 1987 年提出的。
里氏替換原則提供了一種對繼承關系的指導規(guī)則,它強調(diào)子類應該可以替換掉父類,軟件單位的功能不受影響。
如果S是T的子類型,那么在任何T類型出現(xiàn)的地方應該都可以替換為S類型,而不會導致程序的任何錯誤或者異常。
這要求子類子類不應該破壞父類的約束,子類重寫父類的方法時,方法的輸入?yún)?shù)要比父類方法的輸入?yún)?shù)更寬松或者相等,方法的輸出結果要比父類更具體或者相等。
在大部分的編程語言中,里氏替換的規(guī)則已經(jīng)內(nèi)置其中,如果你違反了這些規(guī)則,編譯器會報錯。
4. **接口隔離原則 (Interface Segregation Principle, ISP)**
當一個接口內(nèi)定義的方法過多時,實現(xiàn)這個接口的類可能需要實現(xiàn)一些它并不需要的方法。
這時候,我們就需要將這個接口拆分成多個更細粒度的接口,以便于讓實現(xiàn)類只依賴于它們實際使用的接口方法。
接口應該遵循單一職責原則,應該多用接口組合的方式,不要強迫類依賴于其不使用的方法。
5. **依賴倒置原則 (Dependency Inversion Principle, DIP)**
在傳統(tǒng)的開發(fā)過程中,自然和直觀的方式是,先開發(fā)低層模塊(如數(shù)據(jù)庫訪問、文件操作)然后再開發(fā)高層模塊(如業(yè)務邏輯)。
這導致高層模塊往往依賴于低層模塊,因為高層模塊需要使用低層模塊提供的功能。
依賴倒置原則要求將這種自然的依賴關系倒置或反轉,讓高層和低層模塊都依賴于抽象。
這種倒置使得低層模塊可以自由地改變和擴展,而不會影響到高層模塊。
例如,我們可以先定義一個抽象的數(shù)據(jù)庫訪問接口,然后讓低層模塊實現(xiàn)這個接口,高層模塊依賴于這個接口,從而實現(xiàn)高層模塊和低層模塊的解耦。