天天看點

設計模式-OOD的設計原則(1)-"開-閉原則"

這些OOD原則的一個基石就是"開-閉原則"(Open-Closed Principle OCP).這個原則最早是由Bertrand Meyer提出,英文的原文是:Software entities should be open for extension,but closed for modification.意思是說,一個軟體實體應當對擴充開放,對修改關閉.也就是說,我們在設計一個子產品的時候,應當使這個子產品可以在不被修改的前提下被擴充,換句話說就是,應當可以在不必修改源代碼的情況下改變這個子產品的行為.

      滿足OCP的設計給系統帶來兩個無可比拟的優越性.

  • 通過擴充已有的軟體系統,可以提供新的行為,以滿足對軟體的新需求,使變化中的軟體系統有一定的适應性和靈活性.
  • 已有的軟體子產品,特别是最重要的抽象層子產品不能再修改,這就使變化中的軟體系統有一定的穩定性和延續性.

      具有這兩個優點的軟體系統是一個高層次上實作了複用的系統,也是一個易于維護的系統.那麼,我們如何才能做到這個原則呢?不能修改而可以擴充,這個看起來是自相沖突的.其實這個是可以做到的,按面向對象的說法,這個就是不允許更改系統的抽象層,而允許擴充的是系統的實作層.

      解決問題的關鍵在:抽象化.我們讓子產品依賴于一個固定的抽象體,這樣它就是不可以修改的;同時,通過這個抽象體派生,我們就可以擴充此子產品的行為功能.如此,這樣設計的程式隻通過增加代碼來變化而不是通過更改現有代碼來變化,前面提到的修改的副作用就沒有了.

      "開-閉"原則如果從另外一個角度講述,就是所謂的"對可變性封裝原則"(Principle of Encapsulation of Variation, EVP).講的是找到一個系統的可變因素,将之封裝起來.在我們考慮一個系統的時候,我們不要把關注的焦點放在什麼會導緻設計發生變化上,而是考慮允許什麼發生變化而不讓這一變化導緻重新設計.也就是說,我們要積極的面對變化,積極的包容變化,而不是逃避.

      [SHALL01]将這一思想用一句話總結為:"找到一個系統的可變因素,将它封裝起來",并将它命名為"對可變性的封裝原則".

      "對可變性的封裝原則"意味者兩點:

  1. 一種可變性應當被封裝到一個對象裡面,而不應當散落到代碼的很多角落裡面.同一種可變性的不同表象意味着同一個繼承等級結構中的具體子類.繼承應當被看做是封裝變化的方法,而不應當是被認為從一般的對象生成特殊的對象的方法(繼承經常被濫用).
  2. 一種可變性不應當與另外一種可變性混合在一起.從具體的類圖來看,如果繼承結構超過了兩層,那麼就意味着将兩種不同的可變性混合在了一起.

      "對可變性的封裝原則"從工程的角度說明了如何實作OCP.如果按照這個原則來設計,那麼系統就應當是遵守OCP的.

      但是現實往往是殘酷的,我們不可能100%的遵守OCP,但是我們要向這個目标來靠近.設計者要對設計的子產品對何種變化封閉做出選擇.

繼續閱讀