面向對象程序設計法則

組合

n         (對象)組合是一種通過創建一個組合 了其它對象的對象,從而獲得新功能的複用方法。

n         將功能委託給所組合的一個對象,從而獲得新功能。

n         有些時候也稱之爲“聚合”( aggregation )或“包容”( containment ),儘管有些作者對這些術語賦予了專門的含義

n         例如:

F        聚合:一個對象擁有另一個對象或對另一個對象負責(即一個對象包含另一個對象或是另一個對象的一部分),並且聚合對象和其所有者具有相同的生命週期。(譯者注:即所謂的“同生共死”關係,可參見 GOF Design Patterns: Elements of Reusable Object-Oriented Software 的引言部分。)

F        包容:一種特殊類型的組合,對於其它對象而言,容器中的被包含對象是不可見的,其它對象僅能通過容器對象來訪問被包含對象。( Coad

 

n         包含可以通過以下兩種方式實現:

F        根據引用( By reference

F        根據值( By value

n         C ++允許根據值或引用來實現包含。

n         但是在 Java 中,一切皆爲對象的引用!

組合的優點和缺點

n         優點:

F        容器類僅能通過被包含對象的接口來對其進行訪問。

F        “黑盒”複用,因爲被包含對象的內部細節對外是不可見。

F        對裝性好。

F        實現上的相互依賴性比較小。(譯者注:被包含對象與容器對象之間的依賴關係比較少)

F        每一個類只專注於一項任務。

F        通過獲取指向其它的具有相同類型的對象引用,可以在運行期間動態地定義(對象的)組合。

 

n         缺點:

F        從而導致系統中的對象過多。

F        爲了能將多個不同的對象作爲組合塊( composition block )來使用,必須仔細地對接口進行定義。

繼承

n         (類)繼承是一種通過擴展一個已有對象的實現,從而獲得新功能的複用方法。

n         泛化類(超類)可以顯式地捕獲那些公共的屬性和方法。

n         特殊類(子類)則通過附加屬性和方法來進行實現的擴展。

繼承的優點和缺點

n         優點:

F        容易進行新的實現,因爲其大多數可繼承而來。

F        易於修改或擴展那些被複用的實現。

n         缺點:

F        破壞了封裝性,因爲這會將父類的實現細節暴露給子類。

F        “白盒”複用,因爲父類的內部細節對於子類而言通常是可見的。

F        當父類的實現更改時,子類也不得不會隨之更改。

F        從父類繼承來的實現將不能在運行期間進行改變。

Coad 規則

僅當下列的所有標準被滿足時,方可使用繼承:

n         子類表達了“是一個 的特殊類型”,而非“是一個由 所扮演的角色”。

n         子類的一個實例永遠不需要轉化( transmute )爲其它類的一個對象。

n         子類是對其父類的職責( responsibility )進行擴展,而非重寫或廢除( nullify )。

n         子類沒有對那些僅作爲一個工具類( utility class )的功能進行擴展。

n         對於一個位於實際的問題域( Problem Domain )的類而言,其子類特指一種角色( role ),交易( transaction )或設備( device )。

繼承 / 組合示例 1

 

n         “是一個 的特殊類型”,而非“是一個由 所扮演的角色”

F        失敗。 乘客是人所扮演的一種角色。代理人亦然。

n         永遠不需要轉化

F        失敗。 隨着時間的發展,一個 Person 的子類實例可能會從 Passenger 轉變成 Agent ,再到 Agent Passenger

n         擴展,而非重寫和廢除

F        通過。

n         不要擴展一個工具類

F        通過。

n         在問題域內,特指一種角色,交易或設備

F        失敗。 Person 不是一種角色,交易或設備。

繼承並非適用於此處!

 

使用組合進行挽救!

繼承 / 組合示例 2

 

n         “是一個 的特殊類型”,而非“是一個由 所扮演的角色”

F        通過。 乘客和代理人都是特殊類型的人所扮演的角色。

n         永遠不需要轉化

F        通過。 一個 Passenger 對象將保持不變; Agent 對象亦然。

n         擴展,而非重寫和廢除

F        通過。

n         不要擴展一個工具類

F        通過。

n         在問題域內,特指一種角色,交易或設備

F        通過。 PersonRole 是一種類型的角色。

繼承適用於此處!

繼承 / 組合示例 3

 

n         “是一個 的特殊類型”,而非“是一個由 所扮演的角色”

F        通過。 預訂和購買都是一種特殊類型的交易。

n         永遠不需要轉化

F        通過。 一個 Reservation 對象將保持不變; Purchase 對象亦然。

n         擴展,而非重寫和廢除

F        通過。

n         不要擴展一個工具類

F        通過。

n         在問題域內,特指一種角色,交易或設備

F        通過。 是一種交易。

繼承適用於此處!

繼承 / 組合示例 4

 

n         “是一個 的特殊類型”,而非“是一個由 所扮演的角色”

F        失敗。 預訂不是一種特殊類型的 observable

n         永遠不需要轉化

F        通過。 一個 Reservation 對象將保持不變。

n         擴展,而非重寫和廢除

F        通過。

n         不要擴展一個工具類

F        失敗。 Observable 就是一個工具類。

n         在問題域內,特指一種角色,交易或設備

F        不適用。 Observable 是一個工具類,並非一個問題域的類。。

繼承並非適用於此處!

繼承 / 組合總結

n         組合與繼承都是重要的重用方法

n         OO 開發的早期,繼承被過度地使用

n         隨着時間的發展,我們發現優先使用組合可以獲得重用性與簡單性更佳的設計

n         當然可以通過繼承,以擴充( enlarge )可用的組合類集( the set of composable classes )。

n         因此組合與繼承可以一起工作

n         但是我們的基本法則是:

優先使用對象組合,而非(類)繼承

 

接口

n         接口 是一個對象在對其它的對象進行調用時所知道的方法集合。

n         一個對象可以有多個接口(實際上,接口是對象所有方法的一個子集)

n         類型 是對象的一個特定的接口。

n         不同的對象可以具有相同的類型,而且一個對象可以具有多個不同的類型。

n         一個對象僅能通過其接口才會被其它對象所瞭解。

n         某種意義上,接口是以一種非常侷限的方式,將“是一種 ”表達爲“一種支持該接口的 ”。

n         接口是實現插件化( pluggability )的關鍵

實現繼承和接口繼承

n         實現繼承 類繼承 ):一個對象的實現是根據另一個對象的實現來定義的。

n         接口繼承 子類型化 ):描述了一個對象可在什麼時候被用來替代另一個對象。

n         C++ 的繼承機制既指類繼承,又指接口繼承。

n         C++ 通過繼承純虛類來實現接口繼承。

n         Java 對接口繼承具有單獨的語言構造方式- Java 接口。

n         Java 接口構造方式更加易於表達和實現那些專注於對象接口的設計。

接口的好處

n         優點:

F        Client 不必知道其使用對象的具體所屬類。

F        一個對象可以很容易地被(實現了相同接口的)的另一個對象所替換。

F        對象間的連接不必硬綁定( hardwire )到一個具體類的對象上,因此增加了靈活性。

F        鬆散藕合( loosens coupling )。

F        增加了重用的可能性。

F        提高了(對象)組合的機率,因爲被包含對象可以是任何實現了一個指定接口的類。

n         缺點:

F        設計的複雜性略有增加

(譯者注:接口表示“ ”( LikeA )的關係,繼承表示“ ”( IsA )的關係,組合表示“ ”( HasA )的關係。)

接口實例

 

 

該方法是指其它的一些類可以進行交通工具的駕駛,而不必關心其實際上是(汽車,輪船,潛艇或是其它任何實現了 IManeuverabre 的對象)。

發佈了49 篇原創文章 · 獲贊 4 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章