
1. 單一職責原則
定義
單一職責原則(SRP:Single responsibility principle)又稱單一功能原則。它規(guī)定一個類應(yīng)該只有一個發(fā)生變化的原因。
闡述
單一職責適用于接口、類、方法。顧名思義,就是要求一個接口或類只有一個職責,它就負責一件事情。
好處
- 類的復雜性降低,有清晰明確的定義
- 提高了可讀性和可維護性
- 使得變更引起的風險降低
注意
職責沒有一個量化的標準,并且受非常多因素的制約,現(xiàn)實中實現(xiàn)起來會有困難。
2. 里氏替換原則
定義1
如果對每一個類型為S的對象o1,都有類型為T的對象o2,使得以T定義的所有程序P在所有的對象o1都代替成o2時,程序P的行為沒有發(fā)生變化,那么類型S是類型T的子類型。
定義2
所有引用基類的地方必須能透明地使用其子類的對象。
闡述
通俗點講,只要父類能出現(xiàn)的地方子類就可以出現(xiàn),而且替換為子類也不會產(chǎn)生任何錯誤或異常,使用者可能根本就不需要知道是父類還是子類。
里氏替換原則的4層含義
- 子類必須完全實現(xiàn)父類的方法
- 子類可以有自己的個性
- 覆蓋或?qū)崿F(xiàn)父類的方法時輸入?yún)?shù)可以被放大
- 覆寫或?qū)崿F(xiàn)父類的方法時輸出結(jié)果可以被縮小
3. 依賴倒置原則
定義
依賴倒置原則(Dependence Inversion Principle,DIP),包含三層含義:
- 高層模塊不應(yīng)該依賴低層模塊,兩者都應(yīng)該依賴其抽象
- 抽象不應(yīng)該依賴細節(jié)
- 細節(jié)應(yīng)該依賴抽象
在Java語言中的表現(xiàn)
- 模塊間的依賴通過抽象發(fā)生,實現(xiàn)類之間不發(fā)生直接的依賴關(guān)系,其依賴關(guān)系是通過接口或抽象類產(chǎn)生的;
- 接口或抽象類不依賴于實現(xiàn)類;
- 實現(xiàn)類依賴接口或抽象類。
好處
采用依賴倒置原則可以減少類間的耦合性,提高系統(tǒng)的穩(wěn)定性,降低并行開發(fā)引起的風險,提高代碼的可讀性和可維護性。
實踐方法
- 每個類盡量都有接口或抽象類,或者抽象類和接口兩者都具備
- 變量的表面類型盡量是接口或者是抽象類(有些不必,如xxxUtil類等)
- 任何類都不應(yīng)該從具體類派生,盡量不要覆寫基類的方法
結(jié)合里氏替換原則
接口負責定義public屬性和方法,并且聲明與其他對象的依賴關(guān)系,抽象類負責公共構(gòu)造部分的實現(xiàn),實現(xiàn)類準確的實現(xiàn)業(yè)務(wù)邏輯,同時在適當?shù)臅r候?qū)Ω割愡M行細化。
在項目中,大家只要記住是“面向接口編程”就基本上抓住了依賴倒置原則的核心。
4. 接口隔離原則
定義
- 客戶端不應(yīng)該依賴它不需要的接口
- 類間的依賴關(guān)系應(yīng)該建立在最小的接口上
闡述
接口隔離原則與單一職責的審視角度是不相同的,單一職責要求的是類和接口職責單一,注重的是職責,這是業(yè)務(wù)邏輯上的劃分,而接口隔離原則要求接口的方法盡量少。
結(jié)構(gòu)隔離原則的4層原則
- 接口要盡量小
- 接口要高內(nèi)聚
- 定制服務(wù)(單獨為一個個體提供優(yōu)良的服務(wù))
- 接口設(shè)計是有限度的(靈活設(shè)計接口粒度大?。?/li>
5. 迪米特法則
定義
迪米特法則(Law of Demeter,LoD)也稱為最少知識原則(Least Knowledge Principle,LKP):一個對象應(yīng)該對其他對象有最少的了解。
闡述
通俗地講,一個類應(yīng)該對自己需要耦合或調(diào)用的類知道得最少,你(被耦合或調(diào)用的類)的內(nèi)部是如何復雜都和我沒關(guān)系,那是你的事情,我就知道你提供的這么多public方法,我就調(diào)用這么多,其他的我一概不關(guān)心。
迪米特法則的幾層含義
- 只和朋友交流(出現(xiàn)在成員變量、方法的輸入輸出參數(shù)中的類稱為成員朋友類,而出現(xiàn)在方法體內(nèi)部的類不屬于朋友)
- 朋友間也是有距離的
- 是自己的就是自己的(如果一個方法放在本類中,既不增加類間關(guān)系,也對本類不產(chǎn)生負面影響,就放置在本類中)
6. 開閉原則
定義
一個軟件實體如類、模塊和函數(shù)應(yīng)該對擴展開放,對修改關(guān)閉。
闡述
開閉原則告訴我們應(yīng)盡量通過擴展軟件實體的行為來實現(xiàn)變化,而不是通過修改已有的代碼來完成變化,它是為軟件實體的未來事件而制定的對現(xiàn)行開發(fā)設(shè)計進行約束的一個原則。
重要性
開閉原則是最基礎(chǔ)的一個原則。有以下好處:
- 方便測試
- 提高復用性
- 提高可維護性
- 符合面向?qū)ο箝_發(fā)技術(shù)
實現(xiàn)方法
- 抽象約束
- 通過接口或抽象類約束擴展,對擴展進行邊界限定,不允許出現(xiàn)在接口或抽象類中不存在的public方法
- 參數(shù)類型、引用對象盡量使用接口或者抽象類,而不是實現(xiàn)類
- 抽象層盡量保持穩(wěn)定,一旦確定即不允許修改
- 盡量用配置參數(shù)控制程序的行為(如spring和strust的配置文件)
總結(jié)
六個原則如下:
- Single Responsibility Principle:單一職責原則
- Open Closed Principle:開閉原則
- Liskov Substitution Principle:里氏替換原則
- Law of Demeter:迪米特法則
- Interface Segregation Principle:接口隔離原則
- Dependence Inversion Principle:依賴倒置原則
把這6個原則的首字母(里氏替換原則和迪米特法則的首字母重復,只取一個)聯(lián)合起來就是SOLID(solid,穩(wěn)定的),其代表的含義也就是把這6個原則結(jié)合使用的好處:建立穩(wěn)定、靈活、健壯的設(shè)計,而開閉原則又是重中之重,是最基礎(chǔ)的原則,是其他5大原則的精神領(lǐng)袖。
遵循這6大設(shè)計原則基本上可以應(yīng)對大多數(shù)變化,適當時候可以進行擴充,但是也并不局限于這6大設(shè)計原則。