構件級和源碼級的度量
構件級的軟件度量集中評價軟件構件的特性,它主要包括3C測量,既:內聚度(coheion),耦合度(coupling),和復雜度(complexity),這組測量指標貼切的描述了構件設計質量,我們也能看出各種設計模式和設計原則都在想辦法平衡這些元素。
內聚度和耦合度可以通過考察構件的輸入,輸出參數的性質和個數,全局變量,被調用模塊的個數(扇出),調用的外部模塊數(扇入),得出測量數據。分析公式就不列舉在這里了,公式的大概含義是如果一個模塊有少的輸入參數,且都是數據型的參數,沒有訪問全局數
據,被單一的模塊調用,可以預計這個模塊將有低的耦合度。關于復雜度還有一個著名的測量指標——環復雜度,它基于構件控制流圖進行分析。
源碼級的軟件度量主要評價代碼復雜度,Halstead測量套件被稱為“最著名和研究最完全的軟件復雜度復合度量之一”。它通過研究源代碼中的操作符和操作數,開發出了一系列指標,可以描述代碼的實際體積,開發工作量,開發時間,甚至軟件中被預測的錯誤數。 很多軟件測量工具都提供象耦合度,環復雜度,Halstead測量套件,扇入扇出數,等指標的自動統計,透過這些指標,我們可以掌握代碼的內部特性,分析每次代碼改動對代碼質量的影響。一些停留在定性描述上的質量改進,完全可以通過數據得到印證。比如某部分代碼采用設計模式以后提高了內聚力,降低了耦合度,某塊職責眾多,特別復雜的代碼被拆散,所拆出的各個模塊的復雜度都很低,易于維護。那么通過度量數據一定可以反應出這些特性,比如,源碼級的復雜度指標降低,構件級的耦合度指標降低等等。
代碼實踐
下圖展示了兩段相同功能的代碼,在重構前后的結構示意圖。
ProfileConf直接使用了第三方SNMP協議包,而ProfileConfNew則使用了封裝后的SNMP協議軟件包。進行協議封裝的目的一是為了隔離第三方軟件包,另一個目的是為了簡化客戶端使用SNMP協議棧的操作。改造完成后,我們使用Together自帶的軟件測量工具進行了數據測量。選擇Together菜單中tools——>metrics,里面提供了大量的測量指標。
我們選擇了幾個比較關注的指標,對新舊代碼進行了測量,下面是測量結果。
下表對測量指標做簡單說明。
通過數據可以看出,改進以后,編寫的代碼有所減少,大約節省三分之一的代碼;耦合度有所降低,但并不是特別明顯,因為我們把對第三方協議包的依賴轉為對自己編織的協議包的依賴了;代碼復雜度大大降低,這是因為我們自己編寫的協議包更符合實際使用情況,因而使代碼編寫難度大大降低,非常容易學習,修改和維護。數據說明了一切。
總結
軟件度量最終的目標是要提供統一衡量軟件質量的標準,并促使軟件質量的不斷提高,這項任務被人稱為是“尋找圣杯的任務”。但是,無數的科學事實都說明,如果因為目標太難達到就不作任何工作,就不可能有任何進步。在達到最終目標之前的過程中,會有很多有益的
小發現,這些發現又在不斷促進新的發現,最后使不可能變成可能。
軟件度量科學的發展同樣在追求最終目標的過程中為我們帶來了眾多的有益發現,讓我們用更加科學和嚴謹的態度來看待軟件質量問題;讓我們對代碼的認識從定性描述階段,進入到定量描述階段;讓我們感受到科學和美學的統一所展現出的巨大魅力。
文章來源于領測軟件測試網 http://www.kjueaiud.com/