1.“開——閉”原則:講的是,一個軟件應當對擴展開放,對修改關閉。即,在設計一個模塊的時候,應當使這個模塊可以在不被修改的前提下被擴展。換言之,應當可以在不必修改源代碼的情況下改變這個模塊的任務。
滿足“開——閉”原則的設計可以個一個軟件兩個優越性:
1) 通過擴展已有的軟件系統,可以提供新的行為,以滿足對軟件新的需求,使變化中的軟件系統有一定的適應性和靈活性。
2) 已有的軟件模塊,特別是最重要的抽象層模塊不能再修改,這就是使變化中的軟件系統有一定的穩定性和延續性。
2.里氏代換原則:概念:一個軟件實體如果使用的是一個基類的話,那么一定使用其子類,而且它根本不能察覺出基類對象和子類對象的區別。
里氏代換原則是繼承復用的基石。只有當子類可以替換掉基類,軟件的功能不會受到影響時,基類才能夠在基類的基礎上增加新的行為。
反過來的代換不成立。
必須指出,反過來的代換則不成立,即如果一個軟件實例使用的是一個子類的話,那么它不一定使用基類。
3.接口隔離原則:概念:使用專門的接口比使用單一的接口好。從客戶類的角度來講,一個類對另一個類的依賴性應當是建立在最小接口上的。
“接口”理解為一個類所提供的所有方法的特征的集合,也就是一種邏輯上才存在的概念。
定制服務
接口隔離原則講的是為同一個角色提供寬、窄不同的接口,以應對不同的客戶端要求。
接口污染
過于臃腫的接口是對接口的污染。
4.合成/聚合復用原則:概念:在一個新的對象里面使用一些已有的對象,使之成為新對象的一部分;新的對象通過向這些對象的委派達到復用已有功能的目的。
另一種表述為:要盡量使用合成/聚合關系,盡量不要使用繼承關系。
合成/聚合復用的好處
1) 新對象存取已有對象的唯一方法是通過已有對象的接口。
2) 這種復用是黑盒復用,因為已有對象內部細節是新對象所看不見的。
3) 這種復用所需的依賴較少。
4) 每一個新的類可以將焦點集中在一個任務上。
5) 這種復用可以在運行期間內動態進行,新對象可以動態地引用與已有對象類型相同的對象。
繼承復用的缺點
1)破壞了包裝,因為繼承將超類的實現細節暴露給子類。由于超類的內部細節常常是對子類透明的,所以又稱為白盒復用。
2)如果超類的實現發生改變,那么子類的實現也不得不發生改變。因此,當一個基類發生改變時,修改將擴散到每一級子類,設計師將做大量的修改。
3)從繼承繼承而來的實現是靜態的,不可能在運行時間內發生改變,沒有足夠的靈活性。
5.依賴倒轉原則:概念:要依賴于抽象,不要以來于具體。
另一種表述為:要針對接口編程,不要針對實現編程。
只要一個被引用的對象存在抽象類型,就應當在任何引用該對象的地方使用抽象類型,包括參量的類型聲明,方法的返回類型的聲明,屬性變量的類型聲明等。
怎樣做到依賴倒轉原則
以抽象方式耦合是依賴倒轉原則的關鍵。由于一個抽象耦合關系總要涉及具體類從抽象類繼承,并且需要保證在任何引用到基類的地方都可以替成其子類,因此,里氏代換原則是依賴倒轉原則的基礎。
在抽象層次上的耦合雖然有靈活性,但也帶來了額外的復雜性。在某些情況下,如果一個具體類發生變化的可能性非常小,那么抽象耦合能發揮的好處便十分有限,這時使用具體耦合會更好。
6.迪米特法則:又叫做最少知識原則,就是說,一個對象應當對其他對象有盡可能少的了解。
迪米特法則的各種表述:
1) 只與你直接的朋友們通信
2) 不要跟“陌生人”說話
3) 每一個軟件單位對其他的單位都只有最少的知識,而且局限于那些與本單位密切相關的軟件單位。
狹義的迪米特法則
如果兩個類不必彼此直接通信,那么這兩個類就不應當發生直接的相互作用。如果其中的一個類需要調用另一個類的某一個方法的話,可以通過第三者轉發這個調用。
狹義迪米特法則的缺點
遵循狹義的迪米特法則會產生一個明顯的缺點:會在系統里造成大量的小方法,散落在系統的各個角落,這些方法僅僅是傳遞間接的調用,因此與系統的商務邏輯無關。
朋友的確定
1) 當前對象本身(this)
2) 以參量形式傳入到當前對象方法中的對象
3) 當前對象的實例變量直接引用的對象
4) 當前對象的實例變量如果是一個聚集,那么聚集中的元素也都是朋友
5) 當前對象所創建的對象
posted on 2008-03-27 11:57
Macaulish 閱讀(453)
評論(0) 編輯 收藏 引用