可維護性和可複用性是兩個獨立的目標,就像兩隻奔跑的兔子,並不總是方向一致的。
對於物件導向的軟體系統設計來說,在支援可維護性的同時,提高系統的可複用是一個核心問題。
軟體的維護和普通產品的維護不同,它不僅包含清除錯誤和缺陷,而且包括對已有效能的擴充,以滿足新的設計要求。
軟體的維護就是軟體的再生,一個好的軟體設計必須能夠允許新的設計要求以比較容易和平穩的方式加入到已有的系統中去,從而使這個系統能夠不斷的煥發青春。
導致軟體可維護性低的真正原因有四個:過於僵硬,過於脆弱,複用率低,粘稠度高。
過於僵硬:很難在一個軟體系統裡加入一個新的效能,哪怕是很小的都很難。
過於脆弱:對一個地方的修改,往往會導致看上去沒什麼關係的另一個地方發生故障。
複用率低:所謂複用,就是指一個軟體的組成部分,可以在同一個項目的不同地方甚至令一個項目中重複使用。如果程式員在寫代碼的時候總是發現現有的代碼依賴於一大堆其他的東西,而重新寫自己的代碼,這樣的系統將由複用率低的問題。
粘稠過高:有的時候,一個改動可以以儲存原始設計意圖和原始設計架構的方式進行,也可以是以破壞原始意圖和架構的方式進行。如果一個系統設計總是使得第二種方法比第一種方法容易,就叫粘稠過高。
設計的目標:一個好的設計應該具有如下的性質:可擴充性,靈活性,可插入性
可擴充性:新的效能很容易加入到系統中去,就是可擴充性。這是過於僵硬的反面。
靈活性:可以允許代碼修改平穩的發生,而不會波及到很多其他的模組,這就是靈活性。是過於脆弱的反面。
可插入性:可以很容易的將一個類抽出去,同時將另一個有同樣介面的類加入進來,這就是可插入性,是“粘稠過高”的反面。
複用的重要性:第一,較高的生產效率;第二,較高的軟體品質;第三,適當的使用複用可以改善系統的可維護性。
複用不僅僅是代碼的複用,代碼複用只是複用的初等形式
傳統的複用:代碼的剪貼複用,演算法的複用,資料結構的複用。
在一個物件導向的語言中,資料的抽象化、繼承、封裝和多態性等特性使得一個系統可以在更高的層次上提供複用性。
抽象化和繼承關係使得概念和定義可以複用。多態性使得實現和應用可以複用。抽象化和封裝可以保持和促進系統的可維護性。使得複用的焦點不再集中在函數和演算法等具體實現細節上,而是集中在最重要的含有宏觀商業邏輯的抽象層次上。