1.單一職責原則(Single Responsibility Principle: SRP)
應該有且僅有一個原因引起類的變更。
===========================================================
There should never be more than one reason for a class to change.
注:該原則主要用在接口、類和方法中。
2.里氏替換原則(Liskov Substitution Principle: LSP)
如果對每一個類型為S的對象o1,都有類型為T的對象o2;使得以T定義的所有程序P在所有的對象o1都替換成o2時,程序P的行為不發生任何變化,那么類型S的類型T的子類型。(所有引用基類的地方必須能透明的使用其子類的對象)
===========================================================
If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T, the behavior of P is unchanged where o1 is substituted for o2 then S is a subtype of T.(Functions that use pointers or references to base classes must be able to use object of derived classes without knowing it)
注:
(1)子類必須完全實現父類的方法(如果父類的某些方法在子類中已經發生“畸變”,則建議斷開父子繼承關系,轉而采用依賴、聚集、組合等關系代替繼承)
(2)子類可以自由擴展,子類對象可以代替父類,但父類對象不能代替子類對象
(3)子類覆蓋或者實現父類的方法時輸入參數可以被放大(子類中的方法輸入參數可以和父類方法的輸入參數同類型,或者是父類方法輸入參數的父類型。保證如果子類與父類構成重載時傳入子類對象調用的方法仍是父類的方法,如果子類重寫了父類的方法,則傳入子類對象調用的方法是子類的方法)
(4)覆蓋或實現父類的方法時輸出結果(返回值)可以被縮小(子類覆寫或實現的方法的返回值必須與父類對應方法的返回值同類型或者是父類對應方法的返回值類型的子類)
3.依賴倒置原則
原則1:高層模塊不應該依賴低層模塊,兩個都應該依賴抽象
原則2:抽象不應該依賴細節,細節應該依賴抽象
4.接口隔離原則
接口隔離的定義
(1)客戶端不應該強行依賴它不需要的接口(Clients should not be forced to depend upon interfaces that they don't use)
(2)類間的依賴關系應該建立在最小的接口上(The dependency of one class to another one should depend on the smallest possible interface)
===========================================================
這里的接口是指:
(1)對象接口(Object Interface)
(2)類接口(Class Interface)
===========================================================
接口隔離原則使用時的規范:
(1)接口盡量小
(2)接口高內聚
(3)接口設計有限度
5.迪米特法則(Least Knowledge Principle: LKP)
“最小知識原則”,一個對象對其它對象有最少的了解,即一個類應該對自己需要耦合或調用的類知道得最少,只需要知道它所提供的接口就行。
===========================================================
過分使用迪米特原則,會產生大量這樣的中介和傳遞類,導致系統復雜度變大。所以采用時要反復權衡,既做到結構清晰,又要高內聚低耦合。
6.開閉原則
用抽象構建框架,用實現擴展細節。