類的原理

類原理是設計模式的靈魂,當你在找不到適當的設計模式時,可用原理做指導,自己就能找到合適的“路”。<推薦:Robert Martin 的《Design Principles and Design Patterns》一書>

與模式相比,原理處於更高的層次,多數模式依附與一個潛在的原理集。模式可看做是原理的實例,如同HTML與SGML的關係一樣。原理可指導你設計和選擇最佳模式,它是面向對象設計的核心!

有兩類原理:關於類的,和關於包的。前者着眼於類間關係,通常是設計模式的基礎;後者着眼於包間關係,是許多體系結構模式的基礎(關於體系結構的模式:推薦POSA系列,現在已完備了,共有5卷,再有就是martin flower的企業設計模式 EA。J2ee設計模式),這裏主要給出類原理:

所有的原理都是爲了:彈性的系統。 重用,易擴充,易修改,易替換。

1.ocp(open closed principle首字縮寫)——開放封閉原理:對象類應該是開放的以便於擴展,又要是封閉的以利於修改。 該原理是類原理的始祖,所有其它原理都可從它演化。此原理源於Bertrand Meyer的著作【OOSC97】。原理指出:我們應該在不改動原有類的基礎上就能夠向系統中增加新的功能。OCP中的一個原則就是減少類間的耦合,在抽象層次上建立類間的關聯,不要在兩個具體的類間建立關係,而在具體類和抽象類(接口)間建立關係。

2.LSP(Liskov Substitution Principle)——Liskov替代原理:子類應該可用來替代其基類。該原理可看爲OCP的補充。 該原理由Barbara Liskov 從Bertrand Meyer的契約式設計演化而來(Desgin by Contract 簡稱DBC) 對設計的指導:重寫基類方法時,子類不可以拋出比父類同名方法更多,更抽象的異常。爲了達到可替換的目的必須滿足:子類中方法的前置條件不能強於父類,後置條件不能弱於父類(如果不將可替換性考慮在內,亦可不必理會)。

3.DIP(Dependency Inversion Principle)——依賴性倒置:依賴於抽象類,不要依賴於具體類。 該原理告訴我們如何遵從ocp,如果ocp是目標的話,dip就是達到目標的方法。 該原理鼓勵我們多使用接口,或一些抽象類。常見的範例:

A:SomeAncester sa =((Someancester)(Class.forName("SomeDescendentType"))).newInstance();然後調用sa的某方法。因爲引用是一個基類型,根據Lsp原理,子類對象實例完全可以賦給基類引用。用這種方式加載對象可方便的替換子類 ————僅替換類名即可[甚至可從某配置文件中獲取類名].缺點是類名易寫錯,導致運行時異常。無法給構造方法傳遞參數。

B:抽象耦合:一個類不要與另一個具體的類耦合,即不能與可實例化的類耦合。類應該與基類或抽象類(接口)耦合

C:工廠對象(23種設計模式之一)。由另一個類來負責創建對象實例,而返回的類型是抽象型。使用者均使用此抽象的引用。雖然它違背了dip原理(由於工廠對象會直接使用具體類),但它是精心的違背,仍可接受,是捨己從人,爲了其他部分更好的尊從dip,且將易變部分局部化於工廠對象的內部了。跟據關注點分離宗旨,識別系統中穩定部分與經常變化的部分是很重要的。不必要在穩定的部分引入間接層。

4.ISP(Interface separation Principle)------ 接口分離原理:多個專用接口優於一個單一的通用接口。 就是指接口應具有高內聚性,不相關的接口,勿牽強放在一起,這樣只會給實現者增加負擔。應使接口具有單一的角色。如:爲數據源訪問者提供一個兼具 CRUD(Create,Read,Update,Delete)性質的接口,不如將其合理分開。瞭解並非所有的訪問者都使用這些功能(有的僅僅是爲了讀),這樣實現者也不用去實現一個龐然大物,而其僅有個別功能被使用。

5.CRP(Composite Reuse Principle)——構成重用原理:對象構成物的多態性優於繼承。 一種災難性的錯誤就是將繼承作爲重用的主要機制。crp在Gof95中首先提出。繼承是一種在特殊性中概括出一般性的關係,即類樹中級別高的類是所派生類的一種概括性版本,基類總需要定義一組缺省的特性,這些特性必須能夠應用於從它派生出的任何類。任何時候出現必須對基類所定義的缺省行爲進行覆寫(overWrite)時,就說明基類不是一個很好的概括,基類中的缺省行爲必須保證它適用於所有的派生類。考慮兩個問題:

A:某操作究竟是放在基類中還是應該下放到子類中。放在基類中會不會導致子類出現空實現(方法的實現是空語句),即子類根本就不支持此方法。(算法空對象:一個類實現了某接口但對接口中所定義方法的實現是空語句)。

B:成員方法與成員接口的選擇。什麼時候成員接口比方法更合適?

6.PLK(Principle of Least Knowledge)-------最少知識原理,亦稱Demeter(迪米特)法則:在一個類上的操作中,只有類本身,操作的參數對象,操作中創建的對象和類包含的實例對象等的操作可被調用。

基本思想:避免調用那些調用其他對象的方法所返回的對象上的任何方法。plk建議:儘量調用所包含的對象上的方法,而不要獲取其他對象的引用,但可以通過所包含對象把調用的請求傳遞給原來我們需要獲得的對象。優點:不需要了解被調用方法的對象的任何內部組成部分。不足之處是,不得不創建許多方法用來把調用傳遞給內部對象,致使出現巨大而笨重的接口。(靈活)折中做法:任何需要返回對象引用時,都要保證返回的是接口類型(讓使用者依賴抽象!)。 該思想與互聯網的路由思想異曲同工:只需要知道鄰居結點的路由信息(最少),不需要知道其他。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章