9.1 為什麼要用ocp
在系統的生命週期中,需求變化是難免的。我們的系統怎樣才能適應這些變化,貼切的符合需求呢?如果系統不能適應這些變化,每次進行乙個小的改動,都不得不去修改很多地方,這就說明我們的系統具有僵化性了。使用ocp重構,會使你的系統具有可擴充套件性,當類似的變化再次發生時,可以很容易通過擴充套件滿足變化。
9.2 什麼是ocp
o:open for extention
c:closed for modification
p:principle
開放-封閉原則的意思是,可以通過擴充套件來滿足變化,而不需要修改**(並不是說一點**都不修改,這是不可能的)。
9.3 怎樣用ocp
ocp原則的關鍵,是抽象。我們常說oopl有封裝性、繼承性、多型性等優點,類與類之間要高內聚低耦合,歸根結底兩個字:抽象!沒有良好的抽象,即使使用oopl,**的封裝性、繼承性等特點也是比較差的。敏捷開發中的各種原則,各種設計模式,其實都離不開抽象。
例如:有乙個printer類,負責按公升序列印一組數字。printer使用ascendingsorter進行公升序排序。類圖如下:
第7章說過敏捷開發人員應該做什麼:
運用實踐去發現問題
現在需求發生了變化,需要既能按照公升序列印數字,又能按照降序列印數字。按照當前的設計思路,需要這樣修改:
1. 需要新增descendingsorter,按照降序排序;
2. 需要在printer的print函式中,在每個呼叫ascendingsorter的地方,判斷是要使用ascendingsorter還是descendingsorter。本來,排序是ascendingsorter和descendingsorter的事情,printer不需要關心怎麼排序,但現在卻需要修改printer。這是我們發現的問題。
運用原則去分析問題
我們運用ocp原則來分析這個問題。對於排序方式的變化,不能夠通過擴充套件sorter來滿足,而需要去修改printer。這違背了ocp原則。
運用設計模式去解決問題
這裡我們有兩個設計模式可以解決這個問題:
1. strategy模式
sorter類有乙個純虛函式sort。ascendingsorter和descendingsorter繼承了sorter,並分別實現sort為公升序排序和降序排序。printer的print函式接受sorter型別的引數,呼叫它的sort進行排序。這樣,printer不必關心是公升序還是降序排序。如果以後在增加新的排序方式,只需要增添乙個新的sorter派生類即可,printer不需要修改(當然,呼叫print的地方要修改,指定排序方式)。
2. template method模式
printer類給出了乙個解決問題的框架。在print函式中,呼叫純虛函式sort進行排序,並列印數字。sort的實現延遲到具體的實現類中。
現在對於排序方式的變化,我們的設計已經符合ocp原則了。再有排序方式的變化時,我們可以簡單地通過擴充套件sorter來滿足,不需要去修改printer(當然,呼叫print的地方需要指定排序方式,這裡是免不了要修改的)。
9.4 我們的設計能對所有變化都滿足ocp嗎
不幸的是,現在又來了乙個變化,本來我們列印數字是這種格式「123456」,現在需要能夠按照「123,456」格式列印。當前的設計不能通過擴充套件滿足這個變化,我們需要再次運用ocp和設計模式去重構設計,滿足這個變化。
我們是否有辦法使我們的設計對所有變化都滿足ocp呢?也許有人會在設計時,**各種可能的需求變化,對這些變化做預先設計,使之對所有變化都滿足ocp。但是這種做法往往得不償失:
1. 做抽象是需要很大代價的。我們可能沒有精力去為每個可能的變化做抽象;
2. 這種**往往是錯誤的。影響使用者需求的變化各種各樣,很難準確的**。如果**的變化沒有發生,這些預先的設計會成為系統的累贅,我們需要花費大量精力去維護這些根本用不到的設計。這就是第七章說的不必要的複雜性。
那我們應該怎麼辦呢?答案是:承受第一顆子彈。對於不確定的變化,不要做預先的設計。等到變化發生時,運用ocp原則進行重構,使之能夠通過擴充套件滿足類似的變化。
這個過程可以用下面的流程圖表示:
9.5 結論
一句話:通過抽象,使設計能夠通過擴充套件滿足變化,而不需要修改**。
開放封閉原則(OCP)
開放封閉原則 軟體實體 類,模板,函式等 應該是可以擴充套件的,但是不可以修改。舉個栗子,加入我們要設計乙個系統,在專案啟動的時候我們不可能一下子把所有的需求全部考慮到。我們所需要做的就是多擴充套件,少修改!在我們最初編寫 的時候,假設變化不會發生。當變化發生的時候,我們就建立抽象來隔離以後發生的同...
OCP開放封閉原則
軟體實體 類 模組 函式等 應該是可以擴充套件的,但是不可修改。如果正確的應用了ocp原則,那麼 以後在進行同樣的改動時,就只需要新增新的 不必修改已經正常執行的 1.對於擴充套件是開放的 這意味著模組的行為是可以擴充套件的。當應用的需求改變時,我們可以對模組進行擴充套件,使其具有滿足那些改變的新行...
開放 封閉原則(OCP)
幾乎所有的系統,都不可能一成不變,只要是需求,就一定是會變化的。如何在面對需求的變化的時候,設計的軟體可以相對容易修改,不至於新的需求一來,就把程式推到重來。怎麼樣的設計才能面對需求的改變卻可以保持相對穩定,從而使得系統可以在第乙個版本以後不斷推出新的版本。這就是ocp原則要告訴我們的東西。面對需求...