關鍵字:oo
面向對象軟件設計的原則 :
一、總體原則 :
1. 針對于接口(抽象)編程,而不要針對于實現(具體)編程。
舉例來說:操作系統是對邏輯計算機的抽象,通過操作系統的抽象我們不需要考慮具體使用的硬件配置,可以在較高的層次上進行更高生產力的應用。再如:匯編語言對機器的 0 , 1 代碼進行了抽象,大大加快了開發效率,后來使用的高級語言和第四代語言模型驅動抽象的級別更高,生產力也更高。再如: java 和 .net 實現于一個抽象的軟件虛擬機,進一步使開發出來的組件可以跨平臺和操作系統。通過抽象出數據訪問層(持久化層),可以使業務邏輯和具體的數據庫訪問代碼分離,更換數據庫提供商對已有的組件沒有影響。具體實現可以參照 hibernate 實現和 dao (數據訪問對象)模式。
優勢:
1 )降低程序各個部分之間的耦合性,使程序模塊互換成為可能。調用的客戶端無需知道具體使用的對象類型,只要對象有客戶希望的接口就可以使用,對象具體是如何實現這些接口的,客戶并不需要考慮。
2 )簡化了程序各個部分的單元測試,將需要測試的程序模塊中通過重構提煉出抽象的接口,然后編制和接口一致的 Mock 類,測試就會變得很容易。如果應用了測試優先的方法,從簡化客戶端調用的角度,還可以經過抽象改善軟件模塊的設計。
3 )模塊的部署升級由于模塊之間的耦合度降低變得更加容易。
相關的設計模式有創建型模式中的工廠模式,結構型模式中的代理模式和組合模式等。
2. 對象組合優于類繼承。
面向對象為軟件開發引入了三大工具:繼承,多態和重載。繼承使得程序員可以快速的通過擴展子類來增加功能,但是由于繼承是在編譯時確定的,因此增加的功能較多時,繼承不夠靈活,還有可能出現“子類爆炸”的局面(為了完成新添功能,不得不在繼承體系中添入大量的之間只有細微差別的子類,掌握使用擴展都會變得非常困難)。而通過對象的組合,可以動態透明的添加功能。相關設計模式有裝飾模式和代理模式等。
3. 分離變化。
前面說過需求是在不斷變化的,不同的變化可能是倉庫安全庫存的計算方法,可能是報表和數據的展現形式,通過把這些不同的變化識別并分離出來不同的對象委托,簡化了客戶端的調用和升級。相關的設計模式有命令模式,觀察者模式,策略模式,狀態模式,模版方法模式等。
二、具體原則:
1. 單一職責原則 srp ( single responsibility principle )
一個模塊的功能應該盡可能的內聚。如果一個類發生了變化,引起變化的原因應該有且只有一個。每一個類承擔的職責都是一個變化的軸線,需求變化時,會體現為類的職責的變化。如果一個類承擔的職責過多,就等于把這些職責耦合在了一起,一個職責的變化會影響這個類完成其他職責的能力,會出現前面所說的軟件的臭味之一脆弱性。相關的設計模式有
2. 開放封閉原則 ocp ( open closed principle )
一個模塊應該對功能的擴展開放,支持新的行為,對自身的更改封閉。每次對模塊的修改都可能會引入新的錯誤和新的依賴。因此擴展新功能時,已經編好的模塊源碼和二進制代碼都是不應該修改的。相關的設計模式有適配器模式,橋接模式,訪問者模式等。
3. Liskov 替換原則 lsp ( liskov subtitle principle )
子類型必須可以替換掉他的基類型。一個基類的多個子類型之間要完成動態的替換,各個子類型必須都可以被他們的基類型替換,這樣他們之間動態替換后,客戶端調用的代碼就不需要冗贅的 switch 類型判斷代碼。如果 子類型無法替換基類型,將會導致在派生類對象作為基類對象進行傳值時的錯誤。這樣多態機制處于癱瘓狀態了。相關設計模式為組合模式。
文章來源于領測軟件測試網 http://www.kjueaiud.com/