1 代碼結構分析概述
在編寫代碼時,要求要結構清晰、接口簡單。如果代碼結構過于復雜,會帶來很多問題:代碼很難被理解,不方便編寫測試用例,容易隱藏錯誤,出現問題難以定位,修改代碼容易產生新的Bug等等。因此,需要有一些指標來評估代碼的復雜度,以方便對過于復雜的代碼進行重構。
代碼的復雜度通常可通過以下幾個指標來評估:
- 總行數:包括注釋以及空行在內的代碼行數;
- 語句數目:有效的語句行數,包括#include、#define、#undef 這三個預處理命令在內,括號不包含在內;
- 分支語句比例:分支語句占總語句數目的比例;
- 注釋比例:注釋占總行數的比例;
- 函數數目:函數的數量;
- 平均每個函數的語句數;
- 函數圈復雜度;
- 函數最大嵌套層數;
- 類的數量;
- 平均每個類的函數數量。
2 基于的SourceMonitor代碼結構檢查
當前能夠進行代碼結構檢查的工具有不少,本文中選擇 SourceMonitor 作為代碼結構檢查工具。
2.1 SourceMonitor簡介
官網地址:https://www.derpaul.net/SourceMonitor/
SourceMonitor 是 Campwood Software LLC 擁有版權的自由軟件,非商業用途可免費使用。
SourceMonitor的主要功能是對代碼的一個分析和度量。即使用SourceMonitor軟件我們可以清晰的看到代碼的總行數,注釋比例,語句數以及類的個數和函數的個數。
SourceMonitor 有以下特點:
- 支持對 C、 C++、 C#、 VB.NET、 java、 Delphi、 Visual Basic 以及 HTML 在內的多種語言的源代碼的分析;
- 效率高,每秒鐘能夠分析 10000 行以上的代碼;
- 可以修改各個度量指標的閾值。
2.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)等。
2.2.1 SourceMonitor使用指南
首先在SourceMonitor官網下載SourceMonitor安裝包后,雙擊安裝包,按向導進行安裝即可,這里就不再贅述了。
打開 SourceMonitor,選擇菜單“File→New Project”新建項目。
彈出如下圖所示的語言選擇對話框,選擇源文件的語言以及需要掃描的文件類型,SourceMonitor 對自動掃描對應的源文件進行分析。 閏年判斷函數是使用 C 語言編寫的, 所以選擇 C 語言,掃描的文件類型指定.c 和.h,然后點擊下一步繼續。
在接下來彈出的如下圖所示的對話框中,設置項目的名稱和保存路徑,并點擊下一步繼續。
在接下來彈出的如下圖所示的對話框中,填入源文件所在的目錄,并點擊下一步繼續。
設置源代碼目錄后,后面所有設置都采用默認設置即可,一直點擊下一步直到完成。
在新建項目完成后,系統會自動創建一個檢查點,可以手動修改檢查點的名稱和需要檢查的文件列表。修改完畢后,點擊OK 按鈕檢查點的創建,詳見下圖。
2.2.2 分析代碼結構
新建項目并創建檢查點后,接下來就可以進行代碼結構分析了。在檢查列表中列出了當前已經創建的所有的檢查點,詳見下圖。
針對每個檢查點,SourceMonitor 給出了每個度量指標的具體的值,可以通過左右劃動滾動條進行查看。
如果需要查看某個檢查點是否有指標超標,可右擊對應的檢查點,然后在右鍵菜單中選擇“Display CheckPoint Metrics Kiviat Graph”,詳見下圖。
打開的指標度量圖標詳見下圖。
從指標度量圖表中可以看出,每個指標都有下限和上限值。 在實際應用中,要求注釋比例和平均每個函數的代碼數必須在下限和上限指示的范圍內,而其他的指標則要求不能超出上限,否則代碼就需要重構。
若從指標度量圖中發現某項指標不合格,則可雙擊對應的檢查點打開文件列表。在打開的文件列表中,可以通過點擊表頭改變排序方式以快速找到指標不合格的文件。如下圖所示為按文件名升序進行排序。
找到指標不合格的文件,單擊鼠標右鍵,然后在右鍵菜單中選擇“Display Function Metrics”打開函數列表,詳見下圖。
同樣在打開的函數列表中,可以通過點擊表頭改變排序方式以快速找到指標不合格的函數,然后就可以對對應的函數進行重構。如下圖所示為按照函數名稱升進行排序。
2.2.3 修改指標閾值
在有些時候,開發者可能并不希望使用系統默認的指標閾值,而是希望能夠自定義指標閾值。 SourceMonitor 支持對各個指標的閾值進行自定義,這樣使用時就會更加靈活。選擇菜單“File→Option”,打開選項設置對話框。
如果需要修改對應語言的閾值,可以選中對應的選項卡進行修改即可。詳見下圖。
-
代碼
+關注
關注
30文章
4788瀏覽量
68603
發布評論請先 登錄
相關推薦
評論