面向物件的設計原則(整理于敏捷開發)
阿新 • • 發佈:2019-02-18
“開-閉”原則(OCP)對可變性封裝
The OpenThe 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)儘量使用合成/聚合、儘量不使用繼承
定義:在一個新的物件裡面使用一些已有的物件,使之成為新物件的一部分;新的物件通過向這些物件的委派達到複用這些物件的目的
任何系統在其生命週期中都會發生變化。如果我們希望開發出的系統不會在第一版本後就被拋棄,那麼我們就必須牢牢記住這一點。
軟體組成實體(類,模組,函式,等等)應該是可擴充套件的,但是不可修改的。 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)儘量使用合成/聚合、儘量不使用繼承
定義:在一個新的物件裡面使用一些已有的物件,使之成為新物件的一部分;新的物件通過向這些物件的委派達到複用這些物件的目的