靜態檢查------SourceMonitor的學習和使用


引言

我們提倡編寫功能單一、結構清晰、接口簡單的函數,因為過於復雜的函數會給我們帶來很多問題:加深其他開發人員理解代碼的難度;不方便測試人員對其編寫測試用例;容易隱藏錯誤;出現問題難以定位……怎樣的函數算是復雜的函數?哪些代碼散發着“臭味”?除了依靠經驗豐富的程序員的敏銳嗅覺,我們還可以通過工具,對我們的函數和代碼進行度量。

不像一位嚴格苛刻的代碼檢視人員,代碼度量工具並不會板着臉對我們說:“嗯……這段代碼糟糕透了!",它反饋給我們的是一組度量值(Metrics),怎么看待這些度量值,就因人而異了。對於某個項目組,圈復雜度(度量值中的一項,下文將給出詳細解釋)超過10的函數需要返工,而對另一個項目組來說,這個標准可能降到15。利用這些度量值,我們可以了解哪些方法應該返工或進行更徹底的測試、了解項目當前的狀態,並跟蹤軟件開發的進度。

下面就來看一個常用的代碼度量工具——SourceMonitor。

SourceMonitor

1.總體介紹

SourceMonitor是一款免費的軟件,運行在Windows平台下。它可對多種語言寫就的代碼進行度量,包括C、C++、C#、Java、VB、Delphi和HTML,並且針對不同的語言,輸出不同的代碼度量值。

像其他代碼度量工具一樣,SourceMonitor只關注代碼,並為編碼人員提供及時的反饋,它不是一款項目管理工具,不關注項目實施中從功能分析到設計編碼,再到測試這整個過程。

2.C語言度量值(C Metrics)

前面講了那么多,還沒提到代碼度量的核心內容——度量值。下面以C語言度量值為例,看看SourceMonitor都給我們反饋了哪些信息。

總行數(Lines):包括空行在內的代碼行數;

語句數目(Statements):在C語言中,語句是以分號結尾的。分支語句if,循環語句for、while,跳轉語句goto都被計算在內,預處理語句#include、#define和#undef也被計算在內,對其他的預處理語句則不作計算,在#else和#endif、#elif和#endif之間的語句將被忽略;

分支語句比例(Percent Branch Statements):該值表示分支語句占語句數目的比例,這里的“分支語句”指的是使程序不順序執行的語句,包括if、else、for、while和switch;

注釋比例(Percent Lines with Comments):該值指示注釋行(包括/……/和//……形式的注釋)占總行數的比例;

函數數目(Functions):指示函數的數量;

平均每個函數包含的語句數目(Average Statements per Function):總的函數語句數目除以函數數目得到該值;

函數圈復雜度(Function Complexity):圈復雜度指示一個函數可執行路徑的數目,以下語句為圈復雜度的值貢獻1:if/else/for/while語句,三元運算符語句,if/for/while判斷條件中的"&&"或“||”,switch語句,后接break/goto/ return/throw/continue語句的case語句,catch/except語句;

函數深度(Block Depth):函數深度指示函數中分支嵌套的層數。

對其他語言,SourceMonitor輸出不同的度量值,例如在C++度量值中包括類的數目(Classes),在HTML中包括各個標簽的數目(HTML Tags)、超鏈接數目(Hyperlinks)等。

3.度量值的呈現樣式

SourceMonitor從幾個不同的視圖層次,為我們展示以上列舉的度量值,包括項目視圖、檢查點視圖和函數視圖。

項目視圖(project view)

項目視圖

SourceMonitor下建立項目須在一個文件夾下進行,該文件夾下的源碼文件可以被分成一個或幾個檢查點,項目視圖下列出了各個檢查點的度量值信息。

檢查點視圖(checkpoint view)

檢查點視圖

檢查點視圖中列出了某個檢查點中包含的各個源代碼文件的度量值信息。

函數視圖(method view)

函數視圖

函數視圖中展示了某個檢查點下,某個源文件中所有函數的度量信息,雙擊某函數可以跳轉到源文件中該函數的相應位置。

小結

本文介紹了代碼度量工具SourceMonitor的使用以及圈復雜度等相關概念,SourceMonitor幫助編程人員更多地了解自己編寫的代碼。在我看來,使用代碼度量工具的目的在於:了解我們的勞動成果,在代碼層面上保證產品的質量;審視、改進自己的代碼,提高自身的編程水平。

轉自http://blog.csdn.net/yf210yf/article/details/17535713


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM