2 開閉原則(open-closed principle,ocp)
2.1 什麼是開閉原則
開閉原則是物件導向設計中「可復用設計」的基石,是物件導向設計中最重要的原則之一,其它很多的設計原則都是實現開閉原則的一種手段。
2023年,bertrand meyer在他的著作《object oriented software construction》中提出了開閉原則,它的原文是這樣:「software entities should be open for extension,but closed for modification」。翻譯過來就是:「軟體實體應當對擴充套件開放,對修改關閉」。這句話說得略微有點專業,我們把它講得更通俗一點,也就是:軟體系統中包含的各種元件,例如模組(modules)、類(classes)以及功能(functions)等等,應該在不修改現有**的基礎上,引入新功能。開閉原則中「開」,是指對於元件功能的擴充套件是開放的,是允許對其進行功能擴充套件的;開閉原則中「閉」,是指對於原有**的修改是封閉的,即不應該修改原有的**。
2.2 如何實現開閉原則
實現開閉原則的關鍵就在於「抽象」。把系統的所有可能的行為抽象成乙個抽象底層,這個抽象底層規定出所有的具體實現必須提供的方法的特徵。作為系統設計的抽象層,要預見所有可能的擴充套件,從而使得在任何擴充套件情況下,系統的抽象底層不需修改;同時,由於可以從抽象底層匯出乙個或多個新的具體實現,可以改變系統的行為,因此系統設計對擴充套件是開放的。
我們在軟體開發的過程中,一直都是提倡需求導向的。這就要求我們在設計的時候,要非常清楚地了解使用者需求,判斷需求中包含的可能的變化,從而明確在什麼情況下使用開閉原則。
關於系統可變的部分,還有乙個更具體的對可變性封裝原則(principle of encapsulation of variation, evp),它從軟體工程實現的角度對開閉原則進行了進一步的解釋。evp要求在做系統設計的時候,對系統所有可能發生變化的部分進行評估和分類,每乙個可變的因素都單獨進行封裝。
我們在實際開發過程的設計開始階段,就要羅列出來系統所有可能的行為,並把這些行為加入到抽象底層,根本就是不可能的,這麼去做也是不經濟的,費時費力。另外,在設計開始階段,對所有的可變因素進行預計和封裝也不太現實,也是很難做得到。所以,開閉原則描繪的願景只是一種理想情況或是極端狀態,現實世界中是很難被完全實現的。我們只能在某些元件,在某種程度上符合開閉原則的要求。
通過以上的分析,對於開閉原則,我們可以得出這樣的結論:雖然我們不可能做到百分之百的封閉,但是在系統設計的時候,我們還是要盡量做到這一點。
對於軟體系統的功能擴充套件,我們可以通過繼承、過載或者委託等手段實現。以介面為例,它對修改就是是封閉的,而對具體的實現是開放的,我們可以根據實際的需要提供不同的實現,所以介面是符合開閉原則的。
2.3 開閉原則能夠帶來什麼好處
如果乙個軟體系統符合開閉原則的,那麼從軟體工程的角度來看,它至少具有這樣的好處:
可復用性好。
我們可以在軟體完成以後,仍然可以對軟體進行擴充套件,加入新的功能,非常靈活。因此,這個軟體系統就可以通過不斷地增加新的元件,來滿足不斷變化的需求。
可維護性好。
由於對於已有的軟體系統的元件,特別是它的抽象底層不去修改,因此,我們不用擔心軟體系統中原有元件的穩定性,這就使變化中的軟體系統有一定的穩定性和延續性。
2.4 開閉原則與其它原則的關係
開閉原則具有理想主義的色彩,它是物件導向設計的終極目標。因此,針對開閉原則的實現方法,一直都有物件導向設計的大師費盡心機,研究開閉原則的實現方式。後面要提到的黎克特制代換原則(lsp)、依賴倒轉原則(dip)、介面隔離原則(isp)以及抽象類(abstract class)、介面(interace)等等,都可以看作是開閉原則的實現方法。
架構師之路 7 OOD的開閉原則
2 開閉原則 open closed principle,ocp 2.1 什麼是開閉原則 開閉原則是物件導向設計中 可復用設計 的基石,是物件導向設計中最重要的原則之一,其它很多的設計原則都是實現開閉原則的一種手段。1988年,bertrand meyer在他的著作 object oriented ...
架構師之路 架構師思維的培養
公司的cms 綜合賦碼管理系統 是winform的cs架構。這套系統的架構師換了3屆,到現在已經幾年沒有架構師了。本來入職時,崗位目標就是這個 自動化架構師 後來和領導達成共識先爭取成為儲備架構師,因為架構首先是為業務服務的,而工控行業有許多特別的地方,不是普通的軟體技術堆疊就能做出優秀的工控軟體的...
架構師之路 架構師思維的培養
公司的cms 綜合賦碼管理系統 是winform的cs架構。這套系統的架構師換了3屆,到現在已經幾年沒有架構師了。本來入職時,崗位目標就是這個 自動化架構師 後來和領導達成共識先爭取成為儲備架構師,因為架構首先是為業務服務的,而工控行業有許多特別的地方,不是普通的軟體技術堆疊就能做出優秀的工控軟體的...