物件導向的一些法則:
法則1:優先使用(物件)組合,而非繼承
組合是一種通過建立乙個組合了其它物件的物件,從而獲得新功能的復用方 法有些時候也稱之為「聚合」(aggregation)或「包容」containment)
聚合:乙個物件擁有另乙個物件或對另乙個物件負責(即乙個物件包含另乙個物件或是另乙個物件的一部分),並且聚合物件和其所有者具有相同的生命週期。
包容:一種特殊型別的組合,對於其它物件而言,容器中的被包含物件是不可見的,其它物件僅能通過容器物件來訪問被包含物件。(coad)
組合的優點和缺點:
優點:1、容器類僅能通過被包含物件的介面來對其進行訪問。
2、「黑盒」復用,因為被包含物件的內部細節對外是不可見,封裝性好。
3、實現上的相互依賴性比較小。(被包含物件與容器物件之間的依賴關係比較少)
4、每乙個類只專注於一項任務。
5、通過獲取指向其它的具有相同型別的物件引用,可以在執行期間動態地定義(物件的)組合。
缺點:1、從而導致系統中的物件過多。
2、為了能將多個不同的物件作為組合塊(composition block)來使用,必須仔細地對介面進行定義。
繼承的優點和缺點
優點:1、容易進行新的實現,因為其大多數可繼承而來。
2、易於修改或擴充套件那些被復用的實現。
缺點:1、破壞了封裝性,因為這會將父類的實現細節暴露給子類。
2、「白盒」復用,因為父類的內部細節對於子類而言通常是可見的。
3、當父類的實現更改時,子類也不得不會隨之更改。
4、從父類繼承來的實現將不能在執行期間進行改變。
法則2:針對介面程式設計,而非(介面的)實現
介面介面是乙個物件在對其它的物件進行呼叫時所知道的方法集合。
乙個物件可以有多個介面(實際上,介面是物件所有方法的乙個子集)
型別是物件的乙個特定的介面。不同的物件可以具有相同的型別,而且乙個物件可以具有多個不同的型別。
乙個物件僅能通過其介面才會被其它物件所了解。
介面是實現外掛程式化(pluggability)的關鍵
實現繼承和介面繼承實現繼承( 類繼承):乙個物件的實現是根據另乙個物件的實現來定義的。
介面繼承( 子型別化):描述了乙個物件可在什麼時候被用來替代另乙個物件。
c++的繼承機制既指類繼承,又指介面繼承。
c++通過繼承純虛類來實現介面繼承。
優點:client不必知道其使用物件的具體所屬類。
乙個物件可以很容易地被(實現了相同介面的)的另乙個物件所替換。
物件間的連線不必硬繫結(hardwire)到乙個具體類的物件上,因此增加了靈活性。
鬆散藕合(loosens coupling)。
增加了重用的可能性。提高了(物件)組合的機率,因為被包含物件可以是任何實現了乙個指定介面的類。
缺點:設計的複雜性略有增加
法則3:開放-封閉法則(ocp)
開放-封閉法則認為我們應該試圖去設計出永遠也不需要改變的模組
我們可以新增新**來擴充套件系統的行為。我們不能對已有的**進行修改
符合ocp的模組需滿足兩個標準:
可擴充套件,即「對擴充套件是開放的」(open for extension)-模組的行為可以被擴充套件,以需要滿足新的需求。
不可更改,即「對更改是封閉的」(closed for modification)-模組的源**是不允許進行改動的
法則4:liskov替換法則(lsp)
liskov替換法則(lsp)是根據「多型」而得出的,在pagemanager 中有很多地方使用到這中作法:
例如:public void drawano(cuao * puao)
方法drawano應該可與cuao類的任何子類一起工作,
若乙個函式未能滿足lsp,那麼可能是因為它顯式地引用了超類的一些或所有子類。
這樣的函式也違背了ocp,因為當我們建立乙個新的子類時,會不得不進行**的修改。
為了保持lsp(並與開放-封閉法則一起),所有子類必須符合使用基類的client所期望的行為。
lsp保證乙個子類總是能夠被用在其基類可以出現的地方
來做個小小的測試:
看看這樣的關係應該怎樣確定:
長方形 正方形
如果是你你應該怎樣來設計他們之間的關係呢?
class rectangle
;class square : public rectangle
;從結果來講我們違背了lsp法則
乙個數學意義上的正方形可能是乙個四邊形,但是乙個square物件不是乙個rectangle物件,因為乙個square物件的行為與乙個rectangle物件的行為是不一致的!
從行為上來說,乙個square 不是乙個rectangle!乙個square物件與乙個rectangle物件之間不具有多型的特徵。
一些物件導向的設計法則 1
1.是乙個 的特殊型別 而非 是乙個由 所扮演的角色 失敗。乘客是人所扮演的一種角色。人亦然。2.永遠不需要轉化 失敗。隨著時間的發展,乙個person的子類例項可能會從passenger轉變成agent,再到agent passenger。3.擴充套件,而非重寫和廢除 通過。4.不要擴充套件乙個工...
物件導向的一些知識
oop object oriented programming 物件導向程式設計 00d object oriented design 物件導向設計 面向過程 就是分析出解決問題所需要的步驟,然後用函式把這些步驟一步一步的實現。例如 把大象裝進冰箱裡去。第一步 將冰箱開啟 第二步 將大象放進冰箱 第...
關於物件導向的一些思考
物件導向方法被人談論了二十多年了。我接觸它比較晚,直到九十年代中期才開始學習使用它。若說對這個方法做些評價,那還真是大言不慚了。不過這麼些年來,也週期性的對物件導向做些思考。或對或錯,我想都值得總結一下。一家之言,來看的同學不必太當真。首先我們要區分一下 基於物件 和 物件導向 的區別。基於物件,通...