開閉原則:
如何保證對修改關閉,對擴充套件開放呢?
那麼首先說,為什麼會有需求的變動吧。
1 需求追加。
2 需求變更。
舉個例子把,比如我們有乙個坦克,坦克有種型號。
塔克的基本機能是能走能射擊。
坦克類
70坦克:坦克類
50坦克:坦克類
現在增加90坦克。具體如下?
90坦克:坦克類
符合開閉原則。
這個是機能的變更。符合開閉原則。
現在假設追加紅外瞄準功能,如果想給全部的坦克追加這個機能。
那麼怎麼辦呢?紅外瞄準機能射擊機能的乙個附近機能。
我們給以上的沒種坦克都安裝商這個機能行嗎?
下面我把按照符和開閉原則取設計。
70紅外瞄準坦克:
70坦克
50紅外瞄準坦克:
50坦克
90紅外瞄準坦克:
50坦克
這也符和開閉原則,但是如果我們真的這麼設計了,那麼就有點怪了。
怪在那了呢?重複,明顯的機能重複。
先不管是否符和開閉吧,我們理想的設計應該是這樣的。
間乙個瞄準的類
瞄準類
紅外瞄準:繼承瞄準類
然後坦克類的變更如下
坦克
各個子類設計略。
這裡大家一定有疑問了?
這種修改後的設計是好的,但是設計的過程明顯是不符和開閉原則的?
這裡我的理解是,開閉原則是個靜態原則,我們在每次設計的時候盡量考慮這個原則。
為以後機能的變更留有餘地。
但是變化的東西總會超出我們的想象,我們有不能受限與這個原則。
大膽果斷的重構,任何原則都是為設計服務的。我們要一好的設計為中心。
記錄避免變更,盡量通過擴充套件來應對變更。
這裡回到問題之初,開閉原則的價值是什麼呢?
是新機能的引入對寄存機能的影響盡量的小,就像上面的第一次變更。
90坦克的追加,對繼存的機能幾乎沒有任何影響,70坦克和50坦克,根本不需要再次測試。
但是第二次的變更是不行。
因為坦克基類都變化了,所以必須對全部的坦克進行測試。
那麼有沒有辦法解決這個問題呢?
能:如果我們在坦克的設計之初就考慮到關於瞄準會有紅外瞄準的引入,我們就可以用乙個專門的瞄準類來應對這個變化。
如果最終的那個設計在設計之初,我們就考慮到了。
就可以在第二次變更的時候依然儲存對開閉原則的遵守。
這裡也說明了乙個問題,關於開閉原則的遵守需要有適當的前瞻性。
這裡有涉及到涉及的根本了,封裝共性穩定行,隔離變化和不穩定行。
最後總結一下:原則這東西是為設計服務的,就是給我們乙個設計的基礎方向,不用過於拘泥。
知道他是怎麼個意圖就行了。
怎麼好的設計也有需要突破原則的時候。
把原則當成你設計的參謀吧,他不是司令。
設計原則 開閉原則
開閉原則的含義是對擴充套件開放,對修改關閉。意思就是在遇到新的需求或者變動的時候,提倡對原 擴充套件使其滿足新的需求,不提倡修改原 來達到目的。乙個專案不可能在開發完畢後就一成不變了,它總會有新的需求或者對老的需求進行更新。這樣就要盡可能的遵從設計原則中的開閉原則,這個原則告訴我們,要盡量避免對原 ...
設計原則 開閉原則
怎樣的 改動才能被定義為 擴充套件 怎樣的 改動才定義為 修改 怎樣才算滿足或者違反開閉原則?修改 意味著違反開閉原則嗎?開閉原則是最難理解,也是最難掌握,同時也是最有用的一條原則。這條原則並不是看幾篇文章,理解了其概念就能掌握和靈活應用的。要想深入理解,掌握這條原則,需要大量的實戰。開閉原則,英文...
OCP開閉原則
bertrand meyer提出此原則 模組應對擴充套件開放,對更改關閉 遵循開 閉原則的設計有兩個主要特性 1 對擴充套件開放 這意味著模組的行為可擴充套件。當需求改變時,可對模組進行擴充套件,使其具有滿足那些改變的新行為,使軟體具有適應性和靈活性。2 對更改關閉 對模組行為進行擴充套件時,不應改...