2008年9月28日 星期日

[Design-Pattern] Open-closed Principle(OCP)

Robert C. Martin 曾經說道 "Software entities should be open for extension, but closed for modification."

在設計一個模組時,應該使該模組之後可以在不被修改的前提下被擴充。i.e.不必修改程式碼的情況下使模組改變行為。

這樣的假設之下,乍看之下是不可能的,但如果借用 interface 以及 abstract class 的幫助之下,這樣的情況就有可能會實現。利用 interface 及 abstract class 定義出 method 的 signature 來作為系統中的抽象層,因此這些signature 制定了可能的擴充,i.e.在設計系統之初,就必須為系統的可擴充性加以構想,這也就使得系統中的抽象層不必再修改,i.e.關閉修改之窗。

藉由 implement 抽象層的 object 來實現具體行為,並藉由改變實體行為的模式,來達到擴充的功能,i.e.開啟擴充之窗。

如此就可以滿足"Open-closed Principle",並且具有兩大優點:

1.藉由擴充來位系統提供新的行為,以滿足要求。

2.關閉修改模組可以使系統擁有原有的穩定性。

系統在初期設計時的確很難去思考到 OCP,因為一開始系統在分析時遇到的 class 數量可能不是很多,但是隨著系統的逐步增長, class 的數量可能就會越來越多,當 class 之間的關係越來越複雜的情況下,如果不遵守 OCP,最後系統就會是一團無法擴充與維護的垃圾,因為系統中的 class 之間有著極高的 coupling 與極低的 cohesion,這會造成牽一 class 而動全系統的悲劇。

所以在系統成長到一定程度時,programmer 就要開始思考 class 之間的關聯是否會太過於緊密而失去彈性。

沒有留言: