開-閉原則(Open-Closee Principle
OCP)
一個軟件實體,應當對擴展開放,對修改關閉。
要求一個軟件系統可以在不修改原有代碼的情況下,通過擴展達到增強其功能的目的。
a. 里氏代換原則(LSP): 任何基類出現的地方,子類一定可以出現。
b. 依賴倒轉原則(DIP): 要依賴于抽象,不要依賴于實現。
c. 合成/聚合復用原則(CARP): 要盡量使用合成/聚合,而不是繼承關系達到復用的目的。
d. 接口隔離原則(ISP): 應當為客戶端提供盡可能小的單獨的接口,而不要提供大的總接口。
e. 迪米特法則(LoD): 一個軟件實體應當與盡可能少的其他實體發生相互作用。
只與朋友通信而不與陌生人說話。朋友的定義如下:
·
1. 當前對象本身(this);
·
2. 以參量形式傳入到當是對象方法中的對象;
·
3. 當前對象的實例變量直接引用的對象,如果當前對象的實例變量是一個聚集,則聚集中的元素都是朋友;
·
4. 當前對象所創建的對象。
·
以上法則的缺點是會產生很多小方法,降低效率,產生困惑。克服方法是使用依賴倒轉原則,建立一個抽象陌生人。
將條件轉移語句改寫成為多態性。如果一個條件轉移語句確實封閉了某種商務邏輯的可變性,此時將可變性封裝起來才符合“開-閉”原則設計思想,否則就是“多態性污染”。
接口
單方法接口、標識接口。
不能使用常量接口。
抽象類
應盡可能不繼承具體類而只繼承抽象類。
應當擁有盡可能多的共同代碼,以利于復用。數據應盡可能放到實現類,以減少內存占用。
聯合使用接口和抽象類,即:定義一個接口,再定義一個抽象類實現這一接口,抽象類中將必要的方法實現。這樣做的目的是因為子類只能有一個父類,如果只有抽象類,則類型定義的次要類型將很難做,如果只有接口,則無法對通用部分做實現。
這其實就是“缺省適配模式”。統一命名規范為:Abstract + 接口名,如:接口Collection,抽象類AbstractCollection。