開閉原則(OCP:Open-Closed Principle)是指在進行面向對象設計(OOD:Object Oriented Design)中,設計類或其他程序單位時,應該遵循:
- 對擴展開放(open)
- 對修改關閉(closed)
的設計原則。
開閉原則是判斷面向對象設計是否正確的最基本的原理之一。
根據開閉原則,在設計一個軟件系統模塊(類,方法)的時候,應該可以在不修改原有的模塊(修改關閉)的基礎上,能擴展其功能(擴展開放)。
- 擴展開放:某模塊的功能是可擴展的,則該模塊是擴展開放的。軟件系統的功能上的可擴展性要求模塊是擴展開放的。
- 修改關閉:某模塊被其他模塊調用,如果該模塊的源代碼不允許修改,則該模塊修改關閉的。軟件系統的功能上的穩定性,持續性要求是修改關閉的。
這也是系統設計需要遵循開閉原則的原因:
1)穩定性。開閉原則要求擴展功能不修改原來的代碼,這可以讓軟件系統在變化中保持穩定。
2)擴展性。開閉原則要求對擴展開放,通過擴展提供新的或改變原有的功能,讓軟件系統具有靈活的可擴展性。
遵循開閉原則的系統設計,可以讓軟件系統可複用,並且易於維護。
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
開閉原則的實現方法
爲了滿足開閉原則的 對修改關閉(closed for modification) 原則以及擴展開放(open for extension) 原則,應該對軟件系統中的不變的部分加以抽象,在面向對象的設計中,
- 可以把這些不變的部分加以抽象成不變的接口,這些不變的接口可以應對未來的擴展;
- 接口的最小功能設計原則。根據這個原則,原有的接口要麼可以應對未來的擴展;不足的部分可以通過定義新的接口來實現;
- 模塊之間的調用通過抽象接口進行,這樣即使實現層發生變化,也無需修改調用方的代碼。
接口可以被複用,但接口的實現卻不一定能被複用。接口是穩定的,關閉的,但接口的實現是可變的,開放的。可以通過對接口的不同實現以及類的繼承行爲等爲系統增加新的或改變系統原來的功能,實現軟件系統的柔軟擴展。
簡單地說,軟件系統是否有良好的接口(抽象)設計是判斷軟件系統是否滿足開閉原則的一種重要的判斷基準。現在多把開閉原則等同於面向接口的軟件設計。
開閉原則的相對性
軟件系統的構建是一個需要不斷重構的過程,在這個過程中,模塊的功能抽象,模塊與模塊間的關係,都不會從一開始就非常清晰明瞭,所以構建100%滿足開閉原則的軟件系統是相當困難的,這就是開閉原則的相對性。但在設計過程中,通過對模塊功能的抽象(接口定義),模塊之間的關係的抽象(通過接口調用),抽象與實現的分離(面向接口的程序設計)等,可以儘量接近滿足開閉原則。