面向對象軟件設計中的開閉原則

what:

軟件設計過程中對擴展性開放,對修改關閉。即軟件實體應該在不修改的前提下擴展,這個原則實際上爲軟件設計指明瞭目標。

我們知道軟件設計應當充分考慮軟件的可維護性,即需求發生變化的時候軟件結構能夠靈活地適應這種變化。就評價軟件的可維護性而言,“開—閉”原則提供了一個依據。實際上,設計模式的應用就是使軟件的結構在某種程度上滿足“開—閉”原則。

how:

在面向對象設計中,不允許更改的是系統的抽象層,而允許擴展的是系統的實現層。換言之,定義一個一勞永逸的抽象設計層,允許儘可能多的行爲在實現層被實現  解決問題關鍵在於抽象化,抽象化是面向對象設計的第一個核心本質。

對一個事物抽象化,實質上是在概括歸納總結它的本質。抽象讓我們抓住最最重要的東西,從更高一層去思考。這降低了思考的複雜度,我們不用同時考慮那麼多的東西。換言之,我們封裝了事物的本質,看不到任何細節。

在面向對象編程中,通過抽象類及接口,規定了具體類的特徵作爲抽象層,相對穩定,不需更改,從而滿足“對修改關閉”;而從抽象類導出的具體類可以改變系統的行爲,從而滿足“對擴展開放”。

對實體進行擴展時,不必改動軟件的源代碼或者二進制代碼。關鍵在於抽象。

現有的一些比較流行的設計模式,如組合模式,觀察者模式,工廠模式,原型模式,抽象工廠模式,單例模式,……都在一定程度上就實現了開閉原則。但是也是針對不同的情況使用程度不一。


“開-閉”原則也就是“對可變性的封裝原則”(Principle of Encapsulation of Variation ,EVP)。即找到一個系統的可變因素,將之封裝起來。換言之,在你的設計中什麼可能會發生變化,應使之成爲抽象層而封裝,而不是什麼會導致設計改變才封裝。

      “對可變性的封裝原則”意味着:

       a)一種可變性不應當散落在代碼的許多角落,而應當被封裝到一個對象裏面。同一可變性的不同表象意味着同一個繼承等級結構中的具體子類。因此,此處可以期待繼承關係的出現。繼承是封裝變化的方法,而不僅僅是從一般的對象生成特殊的對象。

       b)一種可變性不應當與另一種可變性混合在一起。作者認爲類圖的繼承結構如果超過兩層,很可能意味着兩種不同的可變性混合在了一起。

       使用“可變性封裝原則”來進行設計可以使系統遵守“開-閉”原則。即使無法百分之百的做到“開-閉”原則,但朝這個方向努力,可以顯著改善一個系統的結構。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章