(轉) 面向物件設計原則(二):開放-封閉原則(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
版權宣告:本文為博主原創文章,轉載請附上博文連結!