1. 程式人生 > >軟體的可維護性與可複用性

軟體的可維護性與可複用性

我們常說一個好的系統設計在於其有較高的可維護性和較高的可複用性。其實可維護性與可複用性是兩個獨立的目標,並不總是方向一致。

        軟體的維護就是軟體的再生。一個好的軟體設計,必須能夠允許新的設計要求以較為容易和平穩的方式加入到已有的系統中。但實際上,現有大多數軟體系統不具備這樣的特性。導致一個軟體的可維護性較低的原因有四個:

        1.過於僵硬(Rigidity):很難在系統中加入新功能。因為會波及其它模組,最後會變成跨越幾個模組的大改動。

        2.過於脆弱(Fragility):與過於僵硬同時存在。對一個地方的修改,往往導致看上去沒有什麼關係的另一個地方發生故障。修改完成前,系統的原始設計師甚至無法預測可能會波及到地方。

        3.複用率低(Immobility):當發現有一段程式碼、函式、模組可用於新功能時,這些已有的程式碼總是依賴一大堆其它的東西,很難將它們分開。

        4.黏度過高(Viscosity):對系統的改動可以採取儲存原始設計意圖和設計框架的方式,也可以以破壞原始意圖和框架的方式進行。前者對系統未來有利,而後者是權宜之計,可以解決短期問題,但會犧牲中長期利益。如果一個系統設計,總是使得第二種辦法比第一種容易,就叫黏度過高。

一個好的系統設計應該有如下的性質:

        1.可擴充套件性(Extensibility):新的效能可以很容易地加入到系統中去。這是”過於僵硬“的相反面。

        2.靈活性(Flexibility):允許程式碼修改平穩的發生,而不會波及到其它模組。這是”過於脆弱“的相反面。

        3.可插入性(Pluggability):可以很容易將一個類抽出去,同時將另一個有同樣介面的類加進來。這是”黏度過高“的相反面。

         設計原則是在提高一個系統的可維護性的同時,提高可複用性的指導原則。這些原則包括:

1.開閉原則(Open-Closed Principle, OCP)

        2.里氏代換原則(Liskov Substitution Principle, LSP)

        3.依賴倒轉原則(Dependency Inversion Principle, DIP)        

        4.介面隔離原則(Interface Segregation Principle, ISP)

        5.組合/聚合複用原則(Composition/Aggregation Reuse Principle, CARP)

        6.迪米特法則(Law of Demeter, LoD)

        這些設計原則首先都是複用的原則,可以提高系統的複用性,同時提高可維護性。設計模式則是對設計原則的具體指導,可以恰當地將理論應用到實踐中。設計模式可以劃分為建立模式、結構模式和行為模式三大類別。

        單純說理論有些晦澀,在《大話設計模式》這本書中舉了活字印刷的故事,我覺得很好的說明了什麼樣的設計是好的設計。

        第一,活字印刷要改印版,只需更改要改之字,此為可維護;

        第二,這些字並非用完這次就無用,完全可以在後來的印刷中重複使用,此乃可複用;

        第三,若要加字,只需另刻字加入即可,這是可擴充套件;

        第四,字的排列其實有可能是豎有可能是橫排,此時只需將活字移動就可做到滿足排列需求,此是靈活性好。