在 程序設計領域砰盐, SOLID(單一功能、開閉原則序目、里氏替換臂痕、接口隔離以及依賴反轉)指代了面向對象編程和面向對象設計的五個基本原則。
SOLID被典型的應用在測試驅動開發(fā)上猿涨,并且是敏捷開發(fā)以及自適應軟件開發(fā)的基本原則的重要組成部分握童。
首字母 | 指代 | 概念 |
---|---|---|
S | 單一功能原則 | 認為對象應該僅具有一種單一功能的概念。 |
O | 開閉原則 | 認為“軟件體應該是對于擴展開放的叛赚,但是對于修改封閉的”的概念澡绩。 |
L | 里氏替換原則 | 程序中的對象應該是可以在不改變程序正確性的前提下被它的子類所替換的稽揭。 |
I | 接口隔離原則 | 多個特定客戶端接口要好于一個寬泛用途的接口。 |
D | 依賴倒置原則 | 依賴于抽象而不是一個實例肥卡,依賴注入是該原則的一種實現溪掀。 |
L | 最少知識原則 | 調用方盡可能少的了解被調用方。 |
1.單一功能原則
單一功能原則(Single Responsibility Principle),簡稱是 SRP步鉴。
規(guī)定每個類都應該有一個單一的功能揪胃,并且該功能應該由這個類完全封裝起來。
作者馬丁把功能(職責)定義為:“改變的原因”氛琢,并且總結出一個類或者模塊應該有且只有一個改變的原因喊递。
2.開閉原則
開閉原則規(guī)定“軟件中的對象(類,模塊艺沼,函數等等)應該對于擴展是開放的册舞,但是對于修改是封閉的”。
該特性在產品化的環(huán)境中是特別有價值的障般,在這種環(huán)境中调鲸,改變源代碼需要代碼審查、單元測試以及諸如此類的用以確保產品使用質量的過程挽荡。遵循這種原則的代碼在擴展時并不發(fā)生改變藐石,因此無需上述的過程。
優(yōu)點:
1.增加穩(wěn)定性定拟。
2.可擴展性高于微。
3.里氏替換原則
里氏替換原則是對子類型的特別定義。
可以描述為:“子類可以在程序中代替父類”青自。該原則依賴于繼承株依、多態(tài)這兩大特性。
優(yōu)點:
1.提高代碼的重用性延窜。
2.提高代碼的可擴展性恋腕。
缺點:
1.繼承是侵入性的。只要繼承逆瑞,就必須繼承父類所有的屬性和方法荠藤。
2.降低子類自身的靈活性。子類會受到來自父類的屬性和方法的約束获高。
3.增加耦合性哈肖。當父類的屬性和方法修改時,必須要考慮子類的修改念秧。
4.接口隔離原則
接口隔離原則(Interface segregation principle, ISP)指明客戶應該不依賴于他們不使用的方法淤井。
接口隔離原則(ISP)拆分非常龐大臃腫的接口成為更小更具體的接口,這樣客戶將會只需要知道他們感興趣的方法。這種縮小的接口被稱為角色接口(role interfaces)庄吼。
類似于面向對象中高內聚性缎除。
接口隔離原則(ISP)的目的是系統解開耦合严就,從而容易重構总寻,更改和重新部署。
優(yōu)點:
1.降低耦合性梢为。
2.隱藏實現細節(jié)渐行。
3.提供代碼可讀性。
5.依賴反轉原則
依賴反轉原則(Dependency inversion principle, DIP)是指一種特定的解耦铸董。
該原則規(guī)定:
1.高層次的模塊不應該依賴于低層次的模塊祟印,兩者都依賴于抽象接口。
2.抽象接口不依賴于具體實現粟害。而具體實現依賴于抽象接口蕴忆。
在 Java 語言中,抽象是接口或者抽象類悲幅,兩者都是不能直接被實例化的套鹅。
細節(jié)是實現類、實現接口或繼承抽象類而產生的類汰具,其特點是可以直接被實例化卓鹿。
依賴倒置原則在 Java 中的體現是:模塊間的依賴通過抽象發(fā)生,實現類之間沒有直接的依賴關系留荔,其依賴關系是通過接口或抽象類產生的吟孙。
優(yōu)點:
1.耦合性低。
2.提高系統穩(wěn)定性聚蝶。
3.可擴展性好杰妓。
補充 迪米特原則
迪米特原則(Least knowledge principle),也被稱為最少知識原則碘勉。
一個類應該對自己需要耦合或者調用的類知道的最少巷挥。
有點類似于接口隔離原則中的最少接口原則,接口隔離原則側重于被處理的接口本身恰聘,迪米特原則側重于調用接口的調用方句各。
優(yōu)點:
1.降低復雜度。
2.降低耦合度晴叨。
本文的靈感來源于維基百科和《Android開發(fā)進階 從小工到專家》凿宾。