突破開閉原則

2021-09-17 02:29:38 字數 1503 閱讀 5036

開閉原則:

如何保證對修改關閉,對擴充套件開放呢?

那麼首先說,為什麼會有需求的變動吧。

1 需求追加。

2 需求變更。

舉個例子把,比如我們有乙個坦克,坦克有種型號。

塔克的基本機能是能走能射擊。

坦克類

70坦克:坦克類

50坦克:坦克類

現在增加90坦克。具體如下?

90坦克:坦克類

符合開閉原則。

這個是機能的變更。符合開閉原則。

現在假設追加紅外瞄準功能,如果想給全部的坦克追加這個機能。

那麼怎麼辦呢?紅外瞄準機能射擊機能的乙個附近機能。

我們給以上的沒種坦克都安裝商這個機能行嗎?

下面我把按照符和開閉原則取設計。

70紅外瞄準坦克:

70坦克

50紅外瞄準坦克:

50坦克

90紅外瞄準坦克:

50坦克

這也符和開閉原則,但是如果我們真的這麼設計了,那麼就有點怪了。

怪在那了呢?重複,明顯的機能重複。

先不管是否符和開閉吧,我們理想的設計應該是這樣的。

間乙個瞄準的類

瞄準類

紅外瞄準:繼承瞄準類

然後坦克類的變更如下

坦克
各個子類設計略。

這裡大家一定有疑問了?

這種修改後的設計是好的,但是設計的過程明顯是不符和開閉原則的?

這裡我的理解是,開閉原則是個靜態原則,我們在每次設計的時候盡量考慮這個原則。

為以後機能的變更留有餘地。

但是變化的東西總會超出我們的想象,我們有不能受限與這個原則。

大膽果斷的重構,任何原則都是為設計服務的。我們要一好的設計為中心。

記錄避免變更,盡量通過擴充套件來應對變更。

這裡回到問題之初,開閉原則的價值是什麼呢?

是新機能的引入對寄存機能的影響盡量的小,就像上面的第一次變更。

90坦克的追加,對繼存的機能幾乎沒有任何影響,70坦克和50坦克,根本不需要再次測試。

但是第二次的變更是不行。

因為坦克基類都變化了,所以必須對全部的坦克進行測試。

那麼有沒有辦法解決這個問題呢?

能:如果我們在坦克的設計之初就考慮到關於瞄準會有紅外瞄準的引入,我們就可以用乙個專門的瞄準類來應對這個變化。

如果最終的那個設計在設計之初,我們就考慮到了。

就可以在第二次變更的時候依然儲存對開閉原則的遵守。

這裡也說明了乙個問題,關於開閉原則的遵守需要有適當的前瞻性。

這裡有涉及到涉及的根本了,封裝共性穩定行,隔離變化和不穩定行。

最後總結一下:原則這東西是為設計服務的,就是給我們乙個設計的基礎方向,不用過於拘泥。

知道他是怎麼個意圖就行了。

怎麼好的設計也有需要突破原則的時候。

把原則當成你設計的參謀吧,他不是司令。

設計原則 開閉原則

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

設計原則 開閉原則

怎樣的 改動才能被定義為 擴充套件 怎樣的 改動才定義為 修改 怎樣才算滿足或者違反開閉原則?修改 意味著違反開閉原則嗎?開閉原則是最難理解,也是最難掌握,同時也是最有用的一條原則。這條原則並不是看幾篇文章,理解了其概念就能掌握和靈活應用的。要想深入理解,掌握這條原則,需要大量的實戰。開閉原則,英文...

OCP開閉原則

bertrand meyer提出此原則 模組應對擴充套件開放,對更改關閉 遵循開 閉原則的設計有兩個主要特性 1 對擴充套件開放 這意味著模組的行為可擴充套件。當需求改變時,可對模組進行擴充套件,使其具有滿足那些改變的新行為,使軟體具有適應性和靈活性。2 對更改關閉 對模組行為進行擴充套件時,不應改...