1. 程式人生 > >(轉) 面向物件設計原則(二):開放-封閉原則(OCP)

(轉) 面向物件設計原則(二):開放-封閉原則(OCP)

原文:https://blog.csdn.net/tjiyu/article/details/57079927

面向物件設計原則(二):開放-封閉原則(OCP)

       開放-封閉原則(Open-closed principle,OCP)也稱開閉原則,是面向物件設計(OOD)中比較重要、常見的一種,下面來總結開放-封閉原則的知識點,包括:

       1、什麼是開放-封閉原則?

       2、為什麼需要遵守開放-封閉原則?

       3、怎麼做到開放-封閉原則?

       4、開放-封閉原則需要注意什麼?

1、什麼是開放-封閉原則(OCP)
1-1、原則的定義
       開放-封閉原則(Open-closedprinciple,OCP)可以表示為:

      軟體實體(類、模組、函式等)應該是可以擴充套件的,但是不可修改的。

1-2、兩個主要的特徵
       遵循開放-封閉原則設計出的模組具有兩個主要的特徵,如下:

1、對於擴充套件是開放的(open for extension)

      這意味著模組的行為是可以擴充套件的。

       當應用的需求改變時,我們可以對模組進行擴充套件,使其具有滿足那些改變的新行為。

       換句話說,我們可以改變模組的功能。

2、對於修改是封閉的(closed for modification)

       對模組行為進行擴充套件時,不必改動模組的原始碼或者二進位制程式碼。

       模組的二進位制可執行版本,無論是可連結的庫、DLL或者.EXE檔案,都無需改動。

2、為什麼需要開放-封閉原則
2-1、開放-封閉原則能帶來什麼?
       可以從下面的一些問題來描述:

      怎麼樣的設計才能面對需求的改變卻可以保持相對穩定,從而使得系統可以在第一版本以後不斷推出新的版本呢?

      怎樣可能在不改動模組原始碼的情況下去更改它的行為呢?

      如果不改變一個模組,又怎麼能夠去改變它的功能呢?

       bertrand meyer 在1988年提出的著名的開放—封閉原則(the open-closed princle)為我們提供了指引。

       在許多方面,開放-封閉原則都是面向物件設計的核心所在,遵循這個原則可以帶來面向物件技術所聲稱的巨大好處:靈活性、可重用性以及靈活性。

2-2、違反開放-封閉原則有什麼壞處?
       違反開放-封閉原則的程式中,通常一處改動就會產生連鎖反應,導致一系列相關模組的改動,那麼設計就具有僵化性。

       OCP建議我們應該對系統進行重構,這樣以後對系統再進行這樣那樣的改動時,就不會導致更多的修改。

       如果正確地應用OCP,那麼以後再進行同樣的改動時,就只需要新增新的程式碼,而不必改動已經正常執行的程式碼。

3、怎麼做到開放-封閉原則
3-1、抽象是關鍵
      由於模組依賴於一個固定的抽象體,所以它對於更改可以是封閉的。

      同時,通過從這個抽象體派生,也可以擴充套件此模組的行為。

3-2、應用開放-封閉原則的兩種方法
      對於類來說,開始OCP依賴於面向物件繼承(特別是實現繼承)的概念;

      而後來,開放/封閉原理被重新定義使用抽象介面,其中可以改變實現,還可以建立多個實現,並且彼此多型地替換。

 

      即可以有兩種方法應用OCP:

1、從抽象類繼承

      最簡單的方法是在繼承原始類實現的新派生(子)類上實現新的功能。

2、實現抽象介面

      另一種方法是使用抽象介面來調解客戶端對原始類的訪問,因此可以通過同一介面訪問的新類實現新功能。

      兩種方法都可以建立新類,並保持原始實現不變,但提倡的是第二種。

4、開放-封閉原則需要注意什麼
4-1、無法做到100%的封閉
      無論模組是多麼的"封閉",都會存在一些無法對之封閉的變化。

      設計人員需要預測出最在可能發生的變化,然後對它的遵循OCP原則;這需要設計人員有一定的經驗,但通常都會預測錯誤。

      對此,我們需要刺激變化:因為變化發生(發現)越早、越快就越有利;刺激變化的一些方法:

      1、首先編寫測試。

      2、使用很短的迭代週期進行開發。

      3、經常把開發特性展示給涉眾。

      4、首先開發最重要的特性。

      5、儘早地、經常性地釋出軟體。儘可能頻繁地把軟體展示給客戶和使用人員,得到他們的反饋。

4-2、良好的抽象是開放-封閉原則的基礎
      遵循開放-封閉原則的代價是昂貴的,如:

      建立適當的抽象是要花費開發時間和精力的;

      同時,那些抽象也增加了軟體設計的複雜性;

      有能力處理抽象的開發人員少。

      所以,對於應用程式中的每個部分都肆意地進行抽象同樣不是一個好主意,正確的做法是,開發人員僅僅對程式中出現頻繁變化的那些部分作出抽象,而拒絕不成熟的抽象。

      後面有時間再來整理介紹面向物件分析與設計中抽象的話題。


4-3、開放-封閉原則與設計模式
      另外,Strategy(策略)模式和Template Method(模板方法)模式是滿足OCP的最常用方法。

      Strategy(策略)模式結構如下,可以看到通過Strategy介面很容易擴充套件具體的實現:

 

5、總結
     開放-封閉原則:

     軟體實體(類、模組、函式等)應該是可以擴充套件的,但是不可修改的。

     即:

    軟體質量的下降,來源於修改;

     替換整個實現類,而不是修改其中的某行;

     替換的擴充套件類可以從抽象類繼承、或實現抽象介面。

    提倡使用實現抽象介面的方式(面向介面程式設計)。

      開放-封閉原則是面向物件設計的核心所在,但主要的還是基本的抽象、繼承、介面的知識,這和我們平時開發息息相關,所以基礎很重要。
---------------------
作者:尐譽
來源:CSDN
原文:https://blog.csdn.net/tjiyu/article/details/57079927
版權宣告:本文為博主原創文章,轉載請附上博文連結!