查看方式:Visual Studio -> Analyze -> Calculate code metrics feature
代碼度量(Code Metrics)是用來測量專業標准的軟件特性。在某些方面,它提供了量化的有用反饋給開發者。
查看代碼度量值很簡單:在項目或解決方案上按右鍵,選擇"Calculate Code Metrics"。 以下是一些類似的結果:
結果窗口中有五個不同的度量特性:圈復雜度(Cyclomatic Complexity), 繼承深度(Depth of Inheritance), 類耦合度(Class Coupling), 代碼行數(Lines of Code), 和一個總的可維護指數(Maintainability Index)。 通過展開左邊的樹結點,你可以從整個項目深入觀察類里面的方法。
但是特征中的那些數字是什么意思呢?
圈復雜度(Cyclomatic Complexity)
圈復雜度是調用方法時取得的線性獨立路徑的總數,基於if,switch,while和類似的分支語句的數量。 如果一個方法沒有這樣的語句存在,就表示方法中只有一條可行路線,這樣的情況下圈復雜度的值為1。
public int DoSomething(int x) { if (x == 1) { // code that is executed when x is 1 } if (x == 2) { // code that is executed when x is 2 } // code that is executed even if x is neither 1 or 2 return x; }
在這個例子中,有三條可行的路線存在,走哪條路線取決於x的值:
1、當x是1
2、當x是2
3、當x不是1也不是2
圈復雜度告訴你兩件重要事:
首先,它指出一個方法的綜合復雜度。值越低越好,如果數值較高,就說明方法可能覆蓋了過多不同情況的處理(例如,嘗試做太多容錯處理),說明方法需要分解成更簡單的只滿足一種情況的單一職責方法(這樣會更容易維護)。
其次,為了確保每種情況都被完全地測試,你必須為每條路線創建唯一的測試用例。 圈復雜度告訴你需要寫多少個測試用例來確保所有可能的情況都已經被覆蓋。
如果一個代碼段的圈復雜度值多於測試用例的數量,你就會發現有些情況沒有被處理,而且可能藏匿着bug。
繼承深度(Depth of Inheritance)
繼承深度是表示一個類的繼承的級數,起始值為1(所有類都是繼承自Object)。 這個例子有3級繼承:
該值是越低越好; 如果繼承深度在3或4以上,你的代碼可能超出設計標准(over-engineered),說明代碼是難以維護的。
數值越高,就越多子類需要修改 -- 消耗時間和金錢,也潛在地引入bug -- 如果你對基類做出重大變更的話。
只要你考慮下每個變更對於子類會引入一些潛在的bug,這些bug會影響到他們引用的所有對象。。。 你就懂我意思了。
類耦合度(Class Coupling)
類耦合度是計算一個類中引用到的對象類型數,不包括原始的和內置的類型,像int和string。 該值是越低越好; 值越高,就代表類綁定了越多類,也意味着存在越多依賴關系在它的中間環境中。
隨着類的耦合度的增加,它就會變得難以分離出來用在另一個項目中。 簡單來講,類的耦合度越高,它的重用性就越低。
我們都看過很多理論案例說類要盡量可重用,但實際編程,大部分類都是高度針對特定項目而編寫的,或多或少需要完全重寫才能"重用"在另一個項目中。
如果類在它最初被創建的時候設計得更完善,我們就可以在之后省掉很多時間。
代碼行數(Lines of Code)
代碼行數是通過計算執行的代碼行數來量度軟件塊的大小。 雖然和上面的特征一樣,這個值也是越低越好(原因很簡單,你以更少的代碼完成功能就能減少你思考的負擔),但在用這個特征前有幾條告誡你需要知道:
1、不是每行代碼都相等。 有些行是非常簡單,有些卻非常復雜,會花費數小時來計算。
2、它不計算已刪除或已覆蓋的代碼
3、有時將一行復雜的代碼分割成幾行會令它更容易理解; 在這樣的情況下,增加了代碼行但更容易維護。
4、除非設計完善並徹底測試過,而且已成型的所有代碼是出自你本人,否則代碼行數不會精確反映投入軟件中的努力的量。
要聰明地使用這個度量值。 在以前,代碼行數出名地被濫用於測量每日的編程生產力,帶來了災難性的結果。 請記住,比起寫代碼,軟件開發有更多重要的東西。
可維護指數(Maintainability Index)
最后是可維護指數,范圍是0到100,用來指示所有類,成員,命名空間或項目的可維護性。 事實上,它是一個之前所有度量值的合計值,但它也同時包含一些額外的度量值,像霍爾斯特德量(Halstead Volume),該值用來量度程序的總長度和詞匯數。 與之前的度量值不同,這個值是越高越好。
可維護指數還提供了一個紅/黃/綠的交通燈圖標,讓你一眼看見問題的區域。 交通燈會轉黃當數值低於20,當數值低於10時會轉紅,這時你需要重新檢查你的代碼以躲避危險。
參考資料
https://blog.csdn.net/zh_geo/article/details/52954145
https://docs.microsoft.com/zh-cn/visualstudio/code-quality/code-metrics-values?view=vs-2017