敏捷軟體開發:開放封閉守則
要對擴充保持開放,對修改保持封閉。
要假設你所設計出來的系統,是可以額外增加程式碼來擴充系統時常變更的功能。而且假設你的程式不能被更改。
就像設計一個函式庫,不能假設使用者要來修改妳的函式庫的原始碼,這樣會造成程式來源不一,版本變更後不相容的情況。
但要對某項時常變更的部份保持開放,例如 排序 的函式庫,通常都會開放「比較的實作」,因為他時常會變更,你可以自己寫一個比較的函式然後當成參數傳進去排序演算法,來讓排序演算法的核心行為改變。
為什麼要當參數傳呢?因為:
- 讓此函式有擴充的彈性。
- 不可以修改排序演算法已經寫好的結構與原始碼。
Web
在設計 Web 的系統時,通常要先瞭解這個系統需要變更的地方在哪裡,然後替這些地方寫成可以擴充,例如一個內容管理系統,以 drupal 為例,他的核心就是頁面,每一個頁面可以視為一個 node ,而他需要擴充的地方在 node 的形式,node 最基本可能是一個文章,也可以被擴充成相簿、相片、投票、留言版,這就是內容管理系統需要被擴充的地方。
所以要把他寫成,基於 node 以後,我可以自己寫一些程式來改變 node 的管理介面,顯示介面。來讓整個 node 被擴充成完全不一樣的形式,又或許可以在現有的所有 node 的生命週期上設計一個 hook 來改變 node 的行為。
例如可以掛 php 或 js ,掛 js 是很 powerful 的,你只要隨便在一個頁面上掛載你的 js 你幾乎可以做任何的事,但…能力越大責任越大,這個彈性會讓你因此而需要確保每個頁面的行為不會因此被你影響到,需要做很多的檢查來確保你在每頁所做的事都不會影響到其他程式。因此最好要有一個類似沙盒的環境來跑這隻 js 限制他所能做的事,來確保不會被某隻兔崽子把牆壁弄破…,整個房子都進水。阿 颱風要來了………