軟件質量判定遇到的問題
判斷和衡量代碼質量一直是開發過程中令人苦惱的問題,在同樣完成功能的情況下,如何判別一種寫法比另一種寫法好呢?在代碼重構的過程中,如何確定代碼質量是在不斷的改進當中呢?引入一種設計模式以后,代碼真的變的比以前好了嗎?
大部分時候我們憑感覺和經驗做這些事情,我們使用很多模糊的詞語來描述我們的判斷,比如這樣做以后,代碼的可維護性更好,可擴展性提高等等。在越來越注重代碼設計的今天,很多人開始使用更感性化,更形而上學的詞語來形容軟件質量,我們會聽到評價軟件結構
很優雅,帶來美的享受,甚至一些設計原則被提升到了哲學高度,:)。
不得不承認這些詞語的描述確實很符合我們看到一段高質量代碼的心境,但是這些新詞語的出現并沒有幫助我們解決軟件質量判定中遇到的問題,因為這些感性的判定,由于每個人的經驗不同,經歷不同,所得出的結論也不盡相同。
軟件度量能解決的問題
眾所周知,度量對任意一個工程產品研制都是很重要的,度量讓人們更加 了解產品,可以評價產品,衡量產品質量從而進行改進。對于軟件產品也一樣,只有定性的評估是不夠的,只有通過定量的評估才可以根本的解決評估軟件產品質量這樣的問題。然而,軟件產品的度量卻非常困難,對它的測量可能永遠無法做到和物理產品一樣的完美,但是,軟件測量仍然具有重要的意義。
要度量軟件質量,首先需要定義軟件質量要素,比如,軟件的功能性(functionality)、可用性(usability)、可靠性(reliability)、性能(performance)和支持度(supportability)都衡量軟件質量的要素。不過,要真正定量的從技術上度量這些要素,就是非常困難的了。
軟件度量工作首先需要確定能夠表示軟件質量的各種屬性和指標;然后,分析軟件,收集數據;接著運用公式換算代碼的各種指標值;最后,通過這些指標就可以分析代碼的質量。確定哪些屬性和指標可以表示軟件質量,收集哪些數據,如何用公式推導指標,都是軟件度量這門科學的研究重點。它所確定的各種軟件度量指標為我們了解軟件屬性,衡量軟件質量提供了科學的依據。
軟件度量經歷了幾十年的發展,在軟件的各個方面和領域都開發出了各種度量套件。有針對分析模型的度量,體系結構設計的度量,構件級設計的度量,界面設計的度量,以及源代碼級的度量等等,要了解這些度量套件如何進行質量測量可以參考相關的資料。不過,這些度
量套件并不是都具備實際的操作意義,有些度量就太復雜不可操作,或者脫離實際很難理解。但是也有一些度量套件具備很實際的指導意義。本文打算介紹的構件級度量套件和源碼級度量套件都是很有意義的。
軟件度量可以幫助我們理解軟件屬性,衡量軟件質量,但是,軟件度量并沒有真正的去測量軟件質量,而是測量軟件質量的表現,因此,仍然需要我們去分析確定所測量的指標和軟件質量的準確關系。
構件級和源碼級的度量
構件級的軟件度量集中評價軟件構件的特性,它主要包括3C測量,既:內聚度(coheion),耦合度(coupling),和復雜度(complexity),這組測量指標貼切的描述了構件設計質量,我們也能看出各種設計模式和設計原則都在想辦法平衡這些元素。
內聚度和耦合度可以通過考察構件的輸入,輸出參數的性質和個數,全局變量,被調用模塊的個數(扇出),調用的外部模塊數(扇入),得出測量數據。分析公式就不列舉在這里了,公式的大概含義是如果一個模塊有少的輸入參數,且都是數據型的參數,沒有訪問全局數
據,被單一的模塊調用,可以預計這個模塊將有低的耦合度。關于復雜度還有一個著名的測量指標——環復雜度,它基于構件控制流圖進行分析。
源碼級的軟件度量主要評價代碼復雜度,Halstead測量套件被稱為“最著名和研究最完全的軟件復雜度復合度量之一”。它通過研究源代碼中的操作符和操作數,開發出了一系列指標,可以描述代碼的實際體積,開發工作量,開發時間,甚至軟件中被預測的錯誤數。 很多軟件測量工具都提供象耦合度,環復雜度,Halstead測量套件,扇入扇出數,等指標的自動統計,透過這些指標,我們可以掌握代碼的內部特性,分析每次代碼改動對代碼質量的影響。一些停留在定性描述上的質量改進,完全可以通過數據得到印證。比如某部分代碼采用設計模式以后提高了內聚力,降低了耦合度,某塊職責眾多,特別復雜的代碼被拆散,所拆出的各個模塊的復雜度都很低,易于維護。那么通過度量數據一定可以反應出這些特性,比如,源碼級的復雜度指標降低,構件級的耦合度指標降低等等。
代碼實踐
下圖展示了兩段相同功能的代碼,在重構前后的結構示意圖。
![]() |
ProfileConf直接使用了第三方SNMP協議包,而ProfileConfNew則使用了封裝后的SNMP協議軟件包。進行協議封裝的目的一是為了隔離第三方軟件包,另一個目的是為了簡化客戶端使用SNMP協議棧的操作。改造完成后,我們使用Together自帶的軟件測量工具進行了數據測量。選擇Together菜單中tools——>metrics,里面提供了大量的測量指標。
![]() |
我們選擇了幾個比較關注的指標,對新舊代碼進行了測量,下面是測量結果。
![]() |
下表對測量指標做簡單說明。
|
通過數據可以看出,改進以后,編寫的代碼有所減少,大約節省三分之一的代碼;耦合度有所降低,但并不是特別明顯,因為我們把對第三方協議包的依賴轉為對自己編織的協議包的依賴了;代碼復雜度大大降低,這是因為我們自己編寫的協議包更符合實際使用情況,因而使代碼編寫難度大大降低,非常容易學習,修改和維護。數據說明了一切。
總結
軟件度量最終的目標是要提供統一衡量軟件質量的標準,并促使軟件質量的不斷提高,這項任務被人稱為是“尋找圣杯的任務”。但是,無數的科學事實都說明,如果因為目標太難達到就不作任何工作,就不可能有任何進步。在達到最終目標之前的過程中,會有很多有益的
小發現,這些發現又在不斷促進新的發現,最后使不可能變成可能。
軟件度量科學的發展同樣在追求最終目標的過程中為我們帶來了眾多的有益發現,讓我們用更加科學和嚴謹的態度來看待軟件質量問題;讓我們對代碼的認識從定性描述階段,進入到定量描述階段;讓我們感受到科學和美學的統一所展現出的巨大魅力。
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/