二 :OCP(開閉原則)

hkmexu發表於2009-03-10

Open-Close Principle

**********************************************************************************

表述:

1. 一個軟體實體應當對擴充套件開放 , 對修改封閉;

 

2. 對可變性的封閉原則;

 

3. 找到一個系統的可變因素,將它封閉起來;

 

 

 

    也就是說在設計一個模組的時候,應當可以在不被修改的前提下被擴充套件。解決問題的關鍵就在於:抽象化!

 

    那就是不允許更改系統的抽象層,而允許擴充套件系統的實現層。

 

   

  我們讓模組依賴於一個固定的抽象體,這樣它就是不可以修改的;同時,通過這個抽象體派生,我們就可以擴充套件此模組的具體功能。這樣設計的程式只通過增加程式碼來變化而不是通過更改現有程式碼來變化,前面提到的修改的副作用就沒有了。

 

   -原則如果從另外一個角度講述,就是找到一個系統的可變因素,將它封裝起來,也即所謂的對可變性的封裝原則”(Principle of Encapsulation of Variation, EVP)

 

   在我們考慮一個系統的時候,我們不要把關注的焦點放在什麼會導致設計發生變化上(具體),而是考慮允許什麼發生變化而不讓這一變化導致重新設計(抽象)。也就是說,我們的設計應支援變化。

   

   

 

總結:

1.         一個軟體系統的所有模組不可能都滿足OCP,但是我們應該努力最小化這些不滿足OCP的模組數量。

2.         開放-封閉法則是OO設計的真正核心。

3.         符合該法則便意味著最高等級的複用性(reusability)和可維護性(maintainability)。

 

 

 

策略模式舉例:商場打折,不同物品不同折扣,不同季節不同折扣

    

   

 “對可變性的封裝原則”意味著兩點:

 1.         一種可變性應當被封裝到一個物件裡面,而不應當散落到程式碼的很多角落裡。

同一種可變性的不同表象意味著同一個繼承等級結構中的具體子類。

繼承應當被看作是封裝變化的方法,而不應當是被認為從一般的物件生成特殊的物件的方法(繼承經常被濫用)

   

 2.         一種可變性不應當與另外一種可變性混合在一起。從具體的類圖來看,如果繼承結構超過了兩層,那麼就意味著將兩種不同的可變性混合在了一起。

 

 “對可變性的封裝原則”從工程的角度說明了如何實現OCP。如果按照這個原則來設計,那麼系統就應當是遵守OCP的。但是現實的情況往往是紛繁複雜的,我們不可能100%的遵守OCP,但是我們要向這個目標來靠近。設計者要對設計的模組對何種變化進行封裝做出選擇。

相關文章