架構設計原則
單一職責原則
描述:A class should have only one reasonto change
(就一個類而言,應該僅有一個引起它變化的原因)
英文縮寫:SRP
英文全稱:single Responsibility Principle
核心思想:系統中的每一個物件都應該只有一個單獨的職責,而所有物件所關注的就是自身職責的完成。
這也是說,每個類應該只有一個職責,對外只能提供一種功能,而引起類變化的原因應該只有一個。也就是我們常說的"高內聚、低耦合”。“單一職責”也就是“單一變化原因”。“職責”也就是引起類變化的原因。
遵循單一職責原則的優點:- 可以降低類的複雜度
- 提高類的可讀性
- 提高系統的可維護性
- 變更
里氏替換原則
描述:Functions that use pointers orreferences to base classes must be able to use objects of derived classeswithout knowing it
(所有引用基類的地方必須能透明地使用其子類的物件)
英文縮寫:LSP
英文全稱:Liskov Substitution Principle
核心思想:在任何父類出現的地方都可以用它的子類來替代。
也就是說,同一個繼承體系中的物件應該有共同的行為特徵。
簡單來說,有四層含義:
- 子類必須完全實現父類的方法
- 子類可以有自己的特性
- 覆蓋或者實現父類的方法時輸入引數可以被放大
- 覆蓋或者實現父類的方法時輸出結果可以被縮小
說明:
當使用繼承時,要遵循里氏替換原則類B繼承類A時,除新增新的方法完成新增功能外,儘量不要重寫父類A的方法,也儘量不要過載父類A的方法父類中已經實現好的方法,實際上是在設定一系列的規範和契約(contract),雖然它不強制要求所有的子類必須遵從這些契約,但是如果子類對這些非抽象方法任意修改,就會對整個繼承體系造成破壞繼承在給程式設計帶來巨大便利的同時,也帶來了弊端介面分離原則
描述:Clients should not be forced todepend upon interfaces that they do not use.(客戶端不應該依賴它不需要的介面
英文縮寫:ISP
英文全稱:Interface Segregation Principle
核心思想:不應該強迫客戶程式依賴它們不需要使用的方法。
也就是說,一個介面不需要提供太多的行為,一個介面應該只提供一種對外的功能,不應該把所有的操作都封裝到一個介面中。
在使用介面分離原則時,需要有一些規範:
- 介面儘量小
- 介面高內聚
- 介面設計是有限度的
說明:
介面分離原則與單一職責原則有些相似,不過不同在於:單一職責原則要求的是類和介面職責單一,注重的是職責,是業務邏輯上的劃分。而介面分離原則要求的介面的方法儘量少,針對一個模組儘量有用。
依賴注入原則(依賴倒置原則)
描述:High-level modules should notdepend on low-levelmodules.Both shoulddepend on abstractions.
(高層模組不應該依賴低層模組,二者都應該依賴其抽象)
英文縮寫:DIP
英文全稱:Dependence Inversion Principle
核心思想:要依賴於抽象,不要依賴於具體的實現。
也就是說,在應用程式中,所有的類如果使用或依賴於其他的類,則都應該依賴於這些其他類的抽象類,而不是這些其他類的具體實現類。抽象層次應該不依賴於具體的實現細節,這樣才能保證系統的可複用性和可維護性。
說明:
- 高層模組不應該依賴低層模組,兩者都應該依賴於抽象(抽象類或介面)
- 抽象(抽象類或介面)不應該依賴於細節(具體實現類)
- 細節(具體實現類)應該依賴抽象
實現方法:
- 通過建構函式傳遞依賴物件
- 通過setter方法傳遞依賴物件
- 介面宣告實現依賴物件
迪米特原則
英文縮寫:LOD
英文全稱:Law of Demeter
核心思想:一個物件應當對其他物件儘可能少地瞭解。
也就是說,要降低各個物件之間的耦合,提高系統的可維護性。在模組之間,應該只通過介面來通訊,而不理會模組的內部工作原理,它可以使各個模組耦合程度降至最低,促進軟體的複用。
開閉原則
描述:Software entities (classes,modules, functions, etc.,)shouldbe open for extension, but closed formodification(一個軟體實體(如類、模組和函式)應該對擴充套件開放,對修改關閉)
英文縮寫:OCP
英文全稱:Open for Extension,Closed for Modification
核心思想:一個物件對擴充套件開和,對修改關閉
也就是說,對類的發動是通過增加程式碼進行的,而不是改動現有的程式碼。換言之,軟體開發人員一旦寫出了可以執行的程式碼,就不應該去改變它,而是要保證它能一直執行下去。