在 程序設(shè)計(jì)領(lǐng)域, SOLID(單一功能、開閉原則、里氏替換、接口隔離以及依賴反轉(zhuǎn))指代了面向?qū)ο缶幊?/strong>和面向?qū)ο笤O(shè)計(jì)的五個(gè)基本原則。
SOLID被典型的應(yīng)用在測試驅(qū)動(dòng)開發(fā)上,并且是敏捷開發(fā)以及自適應(yīng)軟件開發(fā)的基本原則的重要組成部分。
| 首字母 | 指代 | 概念 |
|---|---|---|
| S | 單一功能原則 | 認(rèn)為對象應(yīng)該僅具有一種單一功能的概念。 |
| O | 開閉原則 | 認(rèn)為“軟件體應(yīng)該是對于擴(kuò)展開放的,但是對于修改封閉的”的概念。 |
| L | 里氏替換原則 | 程序中的對象應(yīng)該是可以在不改變程序正確性的前提下被它的子類所替換的。 |
| I | 接口隔離原則 | 多個(gè)特定客戶端接口要好于一個(gè)寬泛用途的接口。 |
| D | 依賴倒置原則 | 依賴于抽象而不是一個(gè)實(shí)例,依賴注入是該原則的一種實(shí)現(xiàn)。 |
| L | 最少知識原則 | 調(diào)用方盡可能少的了解被調(diào)用方。 |
1.單一功能原則
單一功能原則(Single Responsibility Principle),簡稱是 SRP。
規(guī)定每個(gè)類都應(yīng)該有一個(gè)單一的功能,并且該功能應(yīng)該由這個(gè)類完全封裝起來。
作者馬丁把功能(職責(zé))定義為:“改變的原因”,并且總結(jié)出一個(gè)類或者模塊應(yīng)該有且只有一個(gè)改變的原因。
2.開閉原則
開閉原則規(guī)定“軟件中的對象(類,模塊,函數(shù)等等)應(yīng)該對于擴(kuò)展是開放的,但是對于修改是封閉的”。
該特性在產(chǎn)品化的環(huán)境中是特別有價(jià)值的,在這種環(huán)境中,改變源代碼需要代碼審查、單元測試以及諸如此類的用以確保產(chǎn)品使用質(zhì)量的過程。遵循這種原則的代碼在擴(kuò)展時(shí)并不發(fā)生改變,因此無需上述的過程。
優(yōu)點(diǎn):
1.增加穩(wěn)定性。
2.可擴(kuò)展性高。
3.里氏替換原則
里氏替換原則是對子類型的特別定義。
可以描述為:“子類可以在程序中代替父類”。該原則依賴于繼承、多態(tài)這兩大特性。
優(yōu)點(diǎn):
1.提高代碼的重用性。
2.提高代碼的可擴(kuò)展性。
缺點(diǎn):
1.繼承是侵入性的。只要繼承,就必須繼承父類所有的屬性和方法。
2.降低子類自身的靈活性。子類會受到來自父類的屬性和方法的約束。
3.增加耦合性。當(dāng)父類的屬性和方法修改時(shí),必須要考慮子類的修改。
4.接口隔離原則
接口隔離原則(Interface segregation principle, ISP)指明客戶應(yīng)該不依賴于他們不使用的方法。
接口隔離原則(ISP)拆分非常龐大臃腫的接口成為更小更具體的接口,這樣客戶將會只需要知道他們感興趣的方法。這種縮小的接口被稱為角色接口(role interfaces)。
類似于面向?qū)ο笾?strong>高內(nèi)聚性。
接口隔離原則(ISP)的目的是系統(tǒng)解開耦合,從而容易重構(gòu),更改和重新部署。
優(yōu)點(diǎn):
1.降低耦合性。
2.隱藏實(shí)現(xiàn)細(xì)節(jié)。
3.提供代碼可讀性。
5.依賴反轉(zhuǎn)原則
依賴反轉(zhuǎn)原則(Dependency inversion principle, DIP)是指一種特定的解耦。
該原則規(guī)定:
1.高層次的模塊不應(yīng)該依賴于低層次的模塊,兩者都依賴于抽象接口。
2.抽象接口不依賴于具體實(shí)現(xiàn)。而具體實(shí)現(xiàn)依賴于抽象接口。
在 Java 語言中,抽象是接口或者抽象類,兩者都是不能直接被實(shí)例化的。
細(xì)節(jié)是實(shí)現(xiàn)類、實(shí)現(xiàn)接口或繼承抽象類而產(chǎn)生的類,其特點(diǎn)是可以直接被實(shí)例化。
依賴倒置原則在 Java 中的體現(xiàn)是:模塊間的依賴通過抽象發(fā)生,實(shí)現(xiàn)類之間沒有直接的依賴關(guān)系,其依賴關(guān)系是通過接口或抽象類產(chǎn)生的。
優(yōu)點(diǎn):
1.耦合性低。
2.提高系統(tǒng)穩(wěn)定性。
3.可擴(kuò)展性好。
補(bǔ)充 迪米特原則
迪米特原則(Least knowledge principle),也被稱為最少知識原則。
一個(gè)類應(yīng)該對自己需要耦合或者調(diào)用的類知道的最少。
有點(diǎn)類似于接口隔離原則中的最少接口原則,接口隔離原則側(cè)重于被處理的接口本身,迪米特原則側(cè)重于調(diào)用接口的調(diào)用方。
優(yōu)點(diǎn):
1.降低復(fù)雜度。
2.降低耦合度。
本文的靈感來源于維基百科和《Android開發(fā)進(jìn)階 從小工到專家》。