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

2021-08-30 17:19:35 字數 2280 閱讀 8627

開閉原則的意思是軟體實體應該對擴充套件開發,對修改關閉(software entities should be open for extension,but closed for modification)。實現開閉原則的途徑是抽象,將需要擴充套件的部分抽象出來,並留出擴充套件介面。打個比方,比如電腦機箱上有usb的插口,這些插口就是可擴充套件的部分,我們可以在這些usb插口上插上滑鼠,鍵盤,u盤,還可以插上網銀的u盾等等。電腦硬體上對於usb介面的這個設計就是乙個符合開閉原則的設計。

為什麼要遵循開閉原則呢?因為開閉原則可以使軟體系統更容易復用,更容易維護,當某個軟體實體,不適合了,我可以重新做另外一種實現,並將現有的實現替換掉。比如說統計個稅的演算法發生了一些變化,我可以在不改變原有**的情況下,重新實現乙個演算法將原有的演算法替換下來。比如說防毒軟體,在出現一種新的病毒時,開發出乙個查殺這種病毒的新模組,可以只開發更新這個查殺模組,而不需要改變原有系統的內容。

開閉原則這麼好,如何實現符合開閉原則的軟體系統呢?答案是抽象,將可能發生變化的功能點進行抽象,並留出變化的介面。設計模式中很多模式都可以幫我們實現開閉原則,個人的理解設計模式是對抽象用法的一種總結。其實我們在專案已經為開閉原則做了一些工作了,比如說我們進行三層開發,將資料層抽象出來,並定義個資料處理的介面,我們可以通過新開發乙個資料層把剛開始將資料存放到sql server中的實現,修改為將資料存放到my sql中的實現;我們將業務邏輯中的**從ui**中分離出來,這就為我們復用業務邏輯的**提供了可能,我們可以開發乙個專門為手機使用的ui層出來,當使用者用手機訪問我們的系統時,智慧型的切換到手機ui層的**上去執行。

實現開閉原則的例子,其實我都不好意思自己舉例子了,因為我正在使用office 2007寫這篇部落格,在office2007的快捷工具欄中就有一項是載入項,就是說office 2007能將外掛程式載入進來使用,如下圖所示:

snagit在word中新增了乙個外掛程式,這種外掛程式技術就是一種遵循ocp的實現;再說我們整天使用的visual studio 它的可擴充套件程度更高,可以開發很多態別的工具對他進行擴充套件。

為了本文的完整性,我還是厚著臉皮,用重構的方式舉乙個遵循開閉原則的微不足道的實現。

下面的舉例實現的場景是個稅的計算:我的第乙個版本是這樣子的

class program

的人應繳個稅是,",salary, gettax(salary));

}static float gettax(float salary)

}

這個版本中我未做任何抽象,直接呼叫靜態方法算了,可是一不小心開兩會了,個稅要調整了,於是個稅的演算法要進行調整了,怎麼辦呢,因為要少繳稅,我很高興的就要來重構上面的**了,既然個稅的計算方法是乙個變化的東西,我就把它抽象出來吧。

class program

的人應繳個稅是,",salary, gettax(salary));

}static float gettax(float salary)

/// /// 獲得應該使用的個稅計算方法

///

/// 個稅計算方法實現例項

static itaxcalculatestrategy gettaxcalculatestrategy()

}/// /// 定義個稅計算的介面

///

public inte***ce itaxcalculatestrategy

/// /// 兩會前個稅計算辦法的實現

///

public class taxcalculatebefore2conference : itaxcalculatestrategy

}/// /// 兩會後個稅的計算方法

///

public class taxcalculateafter2conference:itaxcalculatestrategy

}

因為要少繳稅,所以我很愉快的重構了之前的**,可以轉眼兩會開完了,結果並非如我預期的個稅變化,咋辦呢?沒關係我們重新開發乙個個稅計算方法,修改下配置就可以仍舊使用之前的個稅計算辦法了。

開閉原則實現的關鍵點在於抽象,也許我們剛開始不知道該把那部分抽象出來,但是這並不是問題,我們可以遵循簡單設計的原則,當變化來了的時候,再重構**,做到一種滿足開閉原則的設計。

切忌到處都抽象,如果到處都抽象就會導致系統過度設計,過度複雜。這反而是不利於系統的維護。完全的開閉原則是不可能實現的,所以請保持簡單設計,在需要的時候做符合開閉原則的設計。

對物件導向設計的基石 開閉原則

開 閉 原則 open closed principle,ocp 的定義及優點 定義 乙個軟體實體應當對擴充套件開放,對修改關閉 software entities should be open for extension,but closed for modification.即在設計乙個模組的時...

物件導向之 開閉原則

我覺得開閉原則,就是對擴充套件開放對修改關閉,在我們寫 過程中,寫死 就是因為沒有遵循開閉原則來實現 就好比蓋房子一樣,地基就好比你的基礎類,地基上面的房子就好比你的實現類,這時候房主說在房子上加一些修飾導致你必須修改地基,如果你去改變地基,你上面的房子都會受到影響,這時候你就會修補房子,讓房子不會...

物件導向設計原則 開閉原則

在軟體開發中,為了提高軟體系統的可維護性和可復用性,增加軟體的可擴充套件性和靈活性,程式設計師要盡量根據 7條原則來開發程式,從而提高軟體開發效率 節約軟體開發成本和維護成本。我們將在下面的幾節中依次來介紹這 7 條原則,本節首先介紹開閉原則。開閉原則 open closed principle,o...