[Tool]Visual Studio 2010 - 程式碼度量

[Tool]Visual Studio 2010 - 程式碼度量

前言
很久之前介紹過一款免費的靜態程式碼分析的工具:
[Tool]SourceMonitor - 程式碼掃瞄,該工具提供多種語言的複雜度、深度等分析,倘若您已經是使用Visual Studio 2010 PREMIUM以上的版本,那麼VS2010就已經有提供類似的工具,供您進行程式碼品質指標的度量。

倘若再結合TFS,那就是CI+版本控管+品質分析+自動建置+單元測試的完整雛形了。

這一篇會介紹一下,在VS2010中,各項指標的意義,以及基本的門檻值。

範例
這一篇文章,以微軟PetShop 4.0的專案來當作分析的樣本。

步驟

  1. 針對想要分析的方案或專案上,按滑鼠右鍵,選擇『計算程式碼度量』。
    選擇程式碼度量
  2. 接著出現各專案分析的結果
    程式碼度量結果

可以看到每個專案的相關指標,展開後還可以看到每一個類別、成員等等的統計數據。通常如果針對整個方案或專案掃瞄,出來的結果很多。要看到想看的數據,我會建議使用Excel開啟,比較方便。可以進行排序、資料篩選,甚至出統計圖表等等。

例如,現在關心的是每一個function,複雜度從大到小的排序,結果就會像這樣:

excel排序結果

 

各項指標說明
這邊約莫給兩個建議數值,可以看各專案與成員的需求調整。

  1. 循環複雜度(Cyclomatic Complexity)
    與SourceMonitor定義相同,也就是程式碼分歧路徑越多,循環複雜度越高。建議每一個成員(也就是function)不超過10,或不超過15。越低越好。
  2. 繼承深度:
    繼承是一種絕對耦合性,繼承的深度越長,代表父類別越無法彈性的修改,因為牽一髮而動全身,子類別都會被影響到。建議不超過3,或不超過5。越低越好。
  3. 類別結合程度(Class Coupling):
    表示此類別引用到多少其他類別。良好的軟體設計應指定聚結性 (Cohesion) 高但結合程度 (Coupling) 低的型別和方法。結合程度高表示設計不易重複使用,因為這種設計包含對其他型別的許多相依性。
  4. 程式碼行數:
    這個數目是以 IL 程式碼為依據,因此不是原始程式碼檔案中精確的行數。 如果數目非常大,表示型別或方法嘗試執行的工作可能過多,而應該分割工作。這也表示該型別或方法可能難以維護。
  5. 可維護性:
    這個指標被我排在最後面,是因為它是一個綜合性的指標,也就是透過前面幾項指標,還有一個『計算複雜度』的指標,來算出可維護性的指數有多高。官方建議:門檻值20~100為高維護性,綠燈。10~20為中維護性,黃燈。0~10為低維護性,紅燈。 所以這個分數是越高越好。


可維護性指數(Maintainability Index)公式是由SEI發展出來,公式為171 - 5.2 * log2(Halstead Volume) - 0.23 * (Cyclomatic Complexity) - 16.2 * log2(Lines of Code)。
這邊出現的Halstead Volume,請參考
wiki的說明

結論
有了這樣的工具,我們在量測系統的品質時,可以透過工具來自動化,讓不懂程式的角色也可以迅速得知系統的品質狀況。Code Review不再需要太多的著墨在工具可以涵蓋的指標上,而專心地review business與performance等其他issues。

Reference

  1. MSDN程式碼度量
  2. PetShop

對敏捷開發有興趣的朋友,可以參考我的粉絲專頁:91敏捷開發之路

若需要聯絡我,可以透過粉絲專頁私訊或是側欄的關於我。