物件導向的一些法則

2021-04-02 09:37:43 字數 2344 閱讀 6797

物件導向的一些法則:

法則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 物件導向設計 面向過程 就是分析出解決問題所需要的步驟,然後用函式把這些步驟一步一步的實現。例如 把大象裝進冰箱裡去。第一步 將冰箱開啟 第二步 將大象放進冰箱 第...

關於物件導向的一些思考

物件導向方法被人談論了二十多年了。我接觸它比較晚,直到九十年代中期才開始學習使用它。若說對這個方法做些評價,那還真是大言不慚了。不過這麼些年來,也週期性的對物件導向做些思考。或對或錯,我想都值得總結一下。一家之言,來看的同學不必太當真。首先我們要區分一下 基於物件 和 物件導向 的區別。基於物件,通...