物件導向設計之開閉原則(OCP)

2021-09-29 18:20:09 字數 1616 閱讀 5491

開閉原則(open closed principle,ocp)

開閉原則(ocp)是物件導向設計中「可復用設計」的基石,是物件導向設計中最重要的原則之一,其它很多的設計原則都是實現開閉原則的一種手段。

2023年,勃蘭特·梅耶(bertrand meyer)在他的著作《物件導向軟體構造(object oriented software construction)》中提出了開閉原則,它的原文是這樣:「software entities should be open for extension,but closed for modification」。翻譯過來就是:「軟體實體應當對擴充套件開放,對修改關閉」。這句話說得略微有點專業,我們把它講得更通俗一點,也就是:軟體系統中包含的各種元件,例如模組(modules)、類(classes)以及功能(functions)等等,應該在不修改現有**的基礎上,引入新功能。

開閉原則中「開」,是指對於元件功能的擴充套件是開放的,是允許對其進行功能擴充套件的;開閉原則中「閉」,是指對於原有**的修改是封閉的,即不應該修改原有的**。

遵循開閉原則設計出的模組具有兩個主要特徵:

(1)對於擴充套件是開放的(open for extension)。這意味著模組的行為是可以擴充套件的。當應用的需求改變時,我們可以對模組進行擴充套件,使其具有滿足那些改變的新行為。也就是說,我們可以改變模組的功能。

(2)對於修改是關閉的(closed for modification)。對模組行為進行擴充套件時,不必改動模組的源**或者二進位制**。模組的二進位制可執行版本,無論是可鏈結的庫、dll或者.exe檔案,都無需改動。

實現方法

實現開閉原則的關鍵就在於「抽象」。把系統的所有可能的行為抽象成乙個抽象底層,這個抽象底層規定出所有的具體實現必須提供的方法的特徵。作為系統設計的抽象層,要預見所有可能的擴充套件,從而使得在任何擴充套件情況下,系統的抽象底層不需修改;同時,由於可以從抽象底層匯出乙個或多個新的具體實現,可以改變系統的行為,因此系統設計對擴充套件是開放的。

我們在軟體開發的過程中,一直都是提倡需求導向的。這就要求我們在設計的時候,要非常清楚地了解使用者需求,判斷需求中包含的可能的變化,從而明確在什麼情況下使用開閉原則。

關於系統可變的部分,還有乙個更具體的對可變性封裝原則(principle of encapsulation of variation, evp),它從軟體工程實現的角度對開閉原則進行了進一步的解釋。evp要求在做系統設計的時候,對系統所有可能發生變化的部分進行評估和分類,每乙個可變的因素都單獨進行封裝。

我們在實際開發過程的設計開始階段,就要羅列出來系統所有可能的行為,並把這些行為加入到抽象底層,根本就是不可能的,這麼去做也是不經濟的。因此我們應該現實的接受修改擁抱變化,使我們的**可以對擴充套件開放,對修改關閉。

好處如果乙個軟體系統符合開閉原則的,那麼從軟體工程的角度來看,它至少具有這樣的好處:

可復用性好。

我們可以在軟體完成以後,仍然可以對軟體進行擴充套件,加入新的功能,非常靈活。因此,這個軟體系統就可以通過不斷地增加新的元件,來滿足不斷變化的需求。

可維護性好。

由於對於已有的軟體系統的元件,特別是它的抽象底層不去修改,因此,我們不用擔心軟體系統中原有元件的穩定性,這就使變化中的軟體系統有一定的穩定性和延續性。

物件導向設計 開閉原則(OCP)

1.概念 物件導向設計的乙個原則,開閉原則 ocp 就是說,軟體中的模組,類,以及功能,應該能夠在不修改現有 的基礎上增加新功能 開 指的是元件功能的擴充套件是開放的 閉 指的是現有的 是關閉的 實現開閉原則最關鍵的是 抽象 就是將系統所有可能的行為抽象成乙個抽象底層,然後這個抽象底層提供所有具體實...

漫談物件導向基石之開閉原則(OCP)

開閉原則的意思是軟體實體應該對擴充套件開發,對修改關閉 software entities should be open for extension,but closed for modification 實現開閉原則的途徑是抽象,將需要擴充套件的部分抽象出來,並留出擴充套件介面。打個比方,比如電腦...

OOD設計原則之開閉原則(OCP)

開閉原則ocp open close principle 被稱作是ood的基石,是ood最重要的原則之一。這個原則由大師bertrand meyer在1988年提出 汗,那個時候恐怕國內還很少人知道oo,甚至計算機為何物 software entities should be open for ex...