敏捷開發的面向對象的設計原則

“開-閉”原則(OCP)對可變性封裝
 
The Open The Open--Closed PrincipleClosed Principle
任何系統在其生命週期中都會發生變化。如果我們希望開發出的系統不會在第一版本後就被拋棄,那麼我們就必須牢牢記住這一點。
軟件組成實體(類,模塊,函數,等等)應該是可擴展的,但是不可修改的。
OCP OCP特徵 特徵
可擴展(對擴展是開放的)
模塊的行爲功能可以被擴展,在應用需求改變或需要滿足新的應用需求時,我們可以讓模塊以不同的方式工作
不可更改(對更改是封閉的)
這些模塊的源代碼是不可改動的。任何人都不許修改模塊的源代碼。
關鍵是抽象!
模塊可以操作一個抽象體。由於模塊依賴於一個固定的抽象體,因此它可以是不允許修改(closed for modification)的;同時,通過從這個抽象體派生,也可擴展此模塊的行爲功能。
符合OCP原則的程序只通過增加代碼來變化而不是通過更改現有代碼來變化,因此這樣的程序就不會引起象非開放―封閉(open-closed)的程序那樣的連鎖反應的變化。

對可變性的封裝
考慮系統中什麼可能會發生變化
一種可變性不應當散落在代碼的很多角落裏,而應當被封裝到一個對象裏
正確理解繼承
一種可變性不應當與另一個可變性混合在一起
選擇性的封閉(Strategic Closure)沒有任何一個大的程序能夠做到100%的封閉。一般來講,無論模塊是多麼的“封閉”,都會存在一些無法對之封閉的變化。既然不可能完全封閉,因此就必須選擇性地對待這個問題。也就是說,設計者必須對於他(她)設計的模塊應該對何種變化封閉做出選擇。

里氏替換原則(LSP)如何進行繼承

Liskov替換原則替換原則
LSP
LSP The The Liskov Substitution Principle
OCP原則背後的主要機制是抽象和多態。支持抽象和多態的關鍵機制是繼承。
LSP LSP的定義 的定義
若對於每一個類型S的對象o1,都存在一個類型T的對象o2,使得在所有針對T編寫的程序P中,用o1替換o2後,程序P的行爲功能不變,則S是T的子類型。
LSP原則清楚地指出,OOD中Is-A關係是就行爲功能而言。行爲功能(behavior)不是內在的、私有的,而是外在、公開的,是客戶程序所依賴的。行爲功能(behavior)纔是軟件所關注的問題!所有派生類的行爲功能必須和客戶程序對其基類所期望的保持一致。
LSP LSP和DBC DBC
DBC(Design by Contract)定義把類和其客戶之間的關係看作是一個正式的協議,明確各方的權利和義務。DBC對類的要求類的方法聲明爲先決條件(precondition)和後續條件(postcondition)。爲了讓方法得以執行,先決條件必須爲真。完成後,方法保證後續條件爲真。DBC對派生類的要求當重新定義派生類中的例行程序時,我們只能用更弱的先決條件和更強的後續條件替換之。
LSP-結論
LSP原則是符合OCP原則應用程序的一項重要特性。僅當派生類能完全替換基類時,我們才能放心地重用那些使用基類的函數和修改派生類型。
 
依賴倒轉原則(DIP)針對接口編程

高層模塊不應該依賴於低層模塊。二者都應該依賴於抽象。
抽象不應該依賴於細節。細節應該依賴於抽象。
實施重點
從問題的具體細節中分離出抽象,以抽象方式對類進行耦合
不足
導致生成大量的類
假定所有的具體類都是會變化的,這也不總是正確的
DIP與設計模式
DIP以LSP爲基礎,是實現OCP的主要手段,是設計模式研究和應用的主要指導原則

接口隔離原則(ISP)恰當的劃分角色和接口
接口的污染(Interface Contamination)一個沒有經驗的設計師往往想節省接口的數目,將一些功能相近或功能相關的接口合併,並將這看成是代碼優化的一部分。
定義:從一個客戶類的角度來講:一個類對另外一個類的依賴性應當是建立在最小的接口上的。使用多個專門的接口比使用單一的總接口要好

合成/聚合複用原則(CARP)儘量使用合成/聚合、儘量不使用繼承
定義:在一個新的對象裏面使用一些已有的對象,使之成爲新對象的一部分;新的對象通過向這些對象的委派達到複用這些對象的目的
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章