設計原則 開閉原則

2021-10-08 10:25:53 字數 1714 閱讀 7496

怎樣的**改動才能被定義為「擴充套件」?

怎樣的**改動才定義為「修改」?

怎樣才算滿足或者違反開閉原則?

修改**意味著違反開閉原則嗎?

開閉原則是最難理解,也是最難掌握,同時也是最有用的一條原則。這條原則並不是看幾篇文章,理解了其概念就能掌握和靈活應用的。要想深入理解,掌握這條原則,需要大量的實戰。

開閉原則,英文全稱:open closed principle,簡稱ocp。軟體實體(模組、類、方法等)應該「對擴充套件開放,對修改關閉」。也就是說:新增乙個新的功能,在已有**的基礎上擴充套件**(新增模組、類、方法等),而非修改已有**(修改模組、類、方法等)。

這裡需要正確的理解「擴充套件」和「修改」?

新增新的功能,完全不修改已有的**是不可能,你需要弄明白的是:什麼樣的**改動稱的上「擴充套件」?什麼樣的**改動才被定義為「修改」?弄明白這兩個問題需要回到這條原則的設計初衷上來。

只要它沒有破壞原有**的正常運轉,沒有破壞原有的單元測試,那麼它就是乙個合格的改動。

也就是說,當我們新增新功能的時候,即使對原有**做了相應的改變,只要原有的功能還能正常的執行,原有的單元測試還能正常使用,那我們就可以認為這樣的**改動屬於擴充套件,而原有的功能和原有的單元測試已經無法使用了,那我們就說這樣的**改動是修改

舉個栗子:在版本公升級的過程中,如果公升級前的版本提供了a功能,公升級後的版本,a功能仍能正常使用,那這次版本公升級時符合開閉原則的,如果公升級後的a功能不能使用的,那它就不遵循開閉原則。

實際上,開閉原則講的是擴充套件性問題,是判定一端**是否易擴充套件的「金標準」,如果某段**在應對未來需求的變化的時候,能夠做到「對擴充套件開放,對修改關閉」,那也就說明這段**的擴充套件性好。所以問如何才能做到「對擴充套件開放,對修改關閉」,也就等同於在問,如何才能寫出擴充套件性好的**?那如何才能做到「對擴充套件開放,對修改關閉」呢?

為了盡量寫出擴充套件性好的**,我們時候具備擴充套件意識、抽象意識、封裝意識,這些「潛意識」可能比任何開發技巧都要重要。在寫**的時候,我們需要多發時間思考一下,這段**可能會有哪些需求更變,如何設計**結構,事先留好擴充套件點,以便在未來的需求更變的時候,在不改變**整體結構、做到最小改動的情況,將新**靈活的插入擴充套件點。

很多的設計原則、設計思想、設計模式、都是以提高**的擴充套件性為最終目的的,特別是23種經典設計模式,大部分都是為了解決**的擴充套件性而總結出來的,都是以開閉原則為指導原則。最常用的提高**的方法有:多型、依賴注入、基於介面而非實現程式設計。以及大部分設計模式(比如:裝飾、策略、模板、責任鏈、狀態)。

比較合理的做法是,對於一些比較確認的,短期內可能就會擴充套件,或者需求改動對**結構影響比較大的情況,或者實現成本不高的擴充套件點,在編碼的時候,我們可以事先做一些**擴充套件性設計。這個當然建立在你對需求的掌握程度之上。

對於一些未來不確定的是否需要的需求,或者實現起來比較複雜的擴充套件點,我們可以等到需求驅動的時候,在通過**重構的方式來支援擴充套件需求。

開閉原則也並不是免費的,有些情況下,**的可擴充套件性會和可讀性發生衝突。為了支援擴充套件性,我們對**進行重構,重構之後的**可能會比之前的的**複雜很多,理解起來也會更加的困難。但是具體情況,需要具體分析,並沒有乙個防止四海皆準的標準,全憑應用場景來決定。在一些情況下,擴充套件性可能更加重要,就會犧牲一下可讀性,而在一些情況下,可讀性更重要,就可以犧牲一下擴充套件性。在有些情況下,實現功能之後,業務需求沒有擴充套件點了 ,也每必要花更多的時間去重構以提高**的擴充套件性。

參考:設計模式之美--王爭

設計原則 開閉原則

開閉原則的含義是對擴充套件開放,對修改關閉。意思就是在遇到新的需求或者變動的時候,提倡對原 擴充套件使其滿足新的需求,不提倡修改原 來達到目的。乙個專案不可能在開發完畢後就一成不變了,它總會有新的需求或者對老的需求進行更新。這樣就要盡可能的遵從設計原則中的開閉原則,這個原則告訴我們,要盡量避免對原 ...

設計原則之開閉原則

定義 乙個軟體實體 類 模組或函式 應當對擴充套件開放,對修改關閉。也就是說軟體實體應盡量在不修改原有 的情況下進行擴充套件。問題 在軟體的生命週期內,因為變化 公升級和維護等原因需要對軟體原有 進行修改時,可能會給舊 中引入錯誤,也可能會使我們不得不對整個功能進行重構,並且需要重新測試。方案 當軟...

設計原則利劍六 開閉原則

英文名稱 open closed principle ocp 中文名稱 開閉原則 作 用 開閉原則與前面幾個原則不一樣,這個屬於是精神層面的原則,其目的就是告訴我們要擁抱變化,如何在考慮未來變化的同時來 設計好自己的專案,以及在變化發生的時候,如何來規避風險,使得變更帶來的影響最小化。乙個遵循開閉原...