總結自
面向對象的設計原則(PDF -〉中科院軟件所互聯網軟件技術實驗室. 陳燁
OCP原則(開閉原則)
模塊的代碼是可擴展的,可以通過繼承、組合等來擴展模塊的功能。
模塊的代碼是不可以修改的,即不可以修改原來模塊中的代碼。
符合OCP的程序只能通過增加代碼而不是更改現有代碼來變化。
一種可變性不應當散落在代碼的各個角落,而應當被封裝在一個對象裏,
同時,一種可變性不應當與另一種可變性混合起來。
如果代碼中遇到很多instance of的判斷,而且當功能擴展時,可能還會
增加類型,是否可以考慮更改原來的instance of結構(見原文OCP實例)
這樣,當類型增加時,可以只需添加一個接口的實現。無需更改原來代碼。
LSP原則(LSP原則)
什麼時候才能正確使用繼承?即S什麼時候纔是T的真正子類?LSP原則
指出:
若對於每一個類型S的對象s1,都存在一個T的類型t1,使得在所有針對
T編寫的程序P中,用s1替換t1後,程序的行爲功能不變,則S是T的子類型。
文中舉了一個矩形和正方形的例子,正方形繼承自矩形,但是,當使用正方
形實例替換矩形之後,程序的行爲功能變掉了。即方法f(rectangle r)執行
不再具有原來的行爲功能了。
行爲功能纔是軟件關注所關注的問題,所有派生類的行爲功能必須和客戶程序
對其基類期望的一致。
DIP原則(依賴倒置原則)
糟糕的設計:很難添加新的功能,因爲每一處改動都會影響系統中過多的模塊
當你做了一處改動,卻導致系統的另一模塊發生了問題,很難在別的應用程序
重用現在的模塊,因爲他不能從現有的應用程序獨立的提取出來。
糟糕的設計是因爲過強的耦合關係,解耦的方法就是使用依賴導置原則。
依賴倒置的基本原則是這樣的:
高層模塊不應該依賴於低層模塊,二層應該依賴於抽象。
抽象不應該依賴於細節,細節應該依賴於抽象。
在java中,面向接口編程就是依賴倒置的一個體現。
實踐中,應該從問題的具體細節中分離出抽象,以抽象的方式對類進行耦合。
依賴倒置的主要缺點就是導致大量的類的生成,由於系統中並不是每個類都會
產生變化,明確確定不發生變化的東西可以不使用該原則。
ISP原則(接口隔離)
這個容易理解,一個類對另一個類的依賴應當是建立在最小接口基礎上的,使用
多個專門的接口比使用單一的總接口要好。
CARP(合成複用原則)
在新對象裏面使用已有的一些對象,通過對已有對象的委派達到複用目的。
一般認爲,合成優於繼承。
LoD (迪米特原則)
“不要和陌生人說話”,即一個對象應當對其他對象有儘可能少的瞭解,這也是
爲了減少耦合性。
一個類儘量只於自己的朋友交談,朋友的條件是這樣的:
(1)當前對象本身
(2)當前對象的方法傳進來的參數變量
(3)當前對象創建的對象
(4)當前對象的實例變量如果是一個聚集,那麼聚集中的元素也都是朋友
迪米特法則的主要用意是控制信息的過載。在將迪米特法則運用到系統
設計中時,要注意下面的幾點:
1)在類的劃分上,應當創建有弱耦合的類。
2)在類的結構設計上,每一個類都應當儘量降低成員的訪問權限。
3)在類的設計上,只要有可能,一個類應當設計成不變類。
4)在對其他類的引用上,一個對象對其對象的引用應當降到最低。