1 代碼結(jié)構(gòu)分析概述
在編寫代碼時,要求要結(jié)構(gòu)清晰、接口簡單。如果代碼結(jié)構(gòu)過于復(fù)雜,會帶來很多問題:代碼很難被理解,不方便編寫測試用例,容易隱藏錯誤,出現(xiàn)問題難以定位,修改代碼容易產(chǎn)生新的Bug等等。因此,需要有一些指標(biāo)來評估代碼的復(fù)雜度,以方便對過于復(fù)雜的代碼進行重構(gòu)。
代碼的復(fù)雜度通常可通過以下幾個指標(biāo)來評估:
- 總行數(shù):包括注釋以及空行在內(nèi)的代碼行數(shù);
- 語句數(shù)目:有效的語句行數(shù),包括#include、#define、#undef 這三個預(yù)處理命令在內(nèi),括號不包含在內(nèi);
- 分支語句比例:分支語句占總語句數(shù)目的比例;
- 注釋比例:注釋占總行數(shù)的比例;
- 函數(shù)數(shù)目:函數(shù)的數(shù)量;
- 平均每個函數(shù)的語句數(shù);
- 函數(shù)圈復(fù)雜度;
- 函數(shù)最大嵌套層數(shù);
- 類的數(shù)量;
- 平均每個類的函數(shù)數(shù)量。
2 基于的SourceMonitor代碼結(jié)構(gòu)檢查
當(dāng)前能夠進行代碼結(jié)構(gòu)檢查的工具有不少,本文中選擇 SourceMonitor 作為代碼結(jié)構(gòu)檢查工具。
2.1 SourceMonitor簡介
官網(wǎng)地址:https://www.derpaul.net/SourceMonitor/
SourceMonitor 是 Campwood Software LLC 擁有版權(quán)的自由軟件,非商業(yè)用途可免費使用。
SourceMonitor的主要功能是對代碼的一個分析和度量。即使用SourceMonitor軟件我們可以清晰的看到代碼的總行數(shù),注釋比例,語句數(shù)以及類的個數(shù)和函數(shù)的個數(shù)。
SourceMonitor 有以下特點:
- 支持對 C、 C++、 C#、 VB.NET、 java、 Delphi、 Visual Basic 以及 HTML 在內(nèi)的多種語言的源代碼的分析;
- 效率高,每秒鐘能夠分析 10000 行以上的代碼;
- 可以修改各個度量指標(biāo)的閾值。
2.2 C語言度量值(C Metrics)
下面以C語言度量值為例,看看SourceMonitor都給我們反饋了哪些信息。
總行數(shù)(Lines) :包括空行在內(nèi)的代碼行數(shù);
語句數(shù)目(Statements) :在C語言中,語句是以分號結(jié)尾的。分支語句if,循環(huán)語句for、while,跳轉(zhuǎn)語句goto都被計算在內(nèi),預(yù)處理語句#include、#define和#undef也被計算在內(nèi),對其他的預(yù)處理語句則不作計算,在#else和#endif、#elif和#endif之間的語句將被忽略;
分支語句比例(Percent Branch Statements) :該值表示分支語句占語句數(shù)目的比例,這里的“分支語句”指的是使程序不順序執(zhí)行的語句,包括if、else、for、while和switch;
注釋比例(Percent Lines with Comments) :該值指示注釋行(包括/……/和//……形式的注釋)占總行數(shù)的比例;
函數(shù)數(shù)目(Functions) :指示函數(shù)的數(shù)量;
平均每個函數(shù)包含的語句數(shù)目(Average Statements per Function) :總的函數(shù)語句數(shù)目除以函數(shù)數(shù)目得到該值;
函數(shù)圈復(fù)雜度(Function Complexity) :圈復(fù)雜度指示一個函數(shù)可執(zhí)行路徑的數(shù)目,以下語句為圈復(fù)雜度的值貢獻1:if/else/for/while語句,三元運算符語句,if/for/while判斷條件中的"&&"或“||”,switch語句,后接break/goto/ return/throw/continue語句的case語句,catch/except語句;
函數(shù)深度(Block Depth) :函數(shù)深度指示函數(shù)中分支嵌套的層數(shù)。
對其他語言,SourceMonitor輸出不同的度量值,例如在C++度量值中包括類的數(shù)目(Classes),在HTML中包括各個標(biāo)簽的數(shù)目(HTML Tags)、超鏈接數(shù)目(Hyperlinks)等。
2.2.1 SourceMonitor使用指南
首先在SourceMonitor官網(wǎng)下載SourceMonitor安裝包后,雙擊安裝包,按向?qū)нM行安裝即可,這里就不再贅述了。
打開 SourceMonitor,選擇菜單“File→New Project”新建項目。
彈出如下圖所示的語言選擇對話框,選擇源文件的語言以及需要掃描的文件類型,SourceMonitor 對自動掃描對應(yīng)的源文件進行分析。 閏年判斷函數(shù)是使用 C 語言編寫的, 所以選擇 C 語言,掃描的文件類型指定.c 和.h,然后點擊下一步繼續(xù)。
在接下來彈出的如下圖所示的對話框中,設(shè)置項目的名稱和保存路徑,并點擊下一步繼續(xù)。
在接下來彈出的如下圖所示的對話框中,填入源文件所在的目錄,并點擊下一步繼續(xù)。
設(shè)置源代碼目錄后,后面所有設(shè)置都采用默認(rèn)設(shè)置即可,一直點擊下一步直到完成。
在新建項目完成后,系統(tǒng)會自動創(chuàng)建一個檢查點,可以手動修改檢查點的名稱和需要檢查的文件列表。修改完畢后,點擊OK 按鈕檢查點的創(chuàng)建,詳見下圖。
2.2.2 分析代碼結(jié)構(gòu)
新建項目并創(chuàng)建檢查點后,接下來就可以進行代碼結(jié)構(gòu)分析了。在檢查列表中列出了當(dāng)前已經(jīng)創(chuàng)建的所有的檢查點,詳見下圖。
針對每個檢查點,SourceMonitor 給出了每個度量指標(biāo)的具體的值,可以通過左右劃動滾動條進行查看。
如果需要查看某個檢查點是否有指標(biāo)超標(biāo),可右擊對應(yīng)的檢查點,然后在右鍵菜單中選擇“Display CheckPoint Metrics Kiviat Graph”,詳見下圖。
打開的指標(biāo)度量圖標(biāo)詳見下圖。
從指標(biāo)度量圖表中可以看出,每個指標(biāo)都有下限和上限值。 在實際應(yīng)用中,要求注釋比例和平均每個函數(shù)的代碼數(shù)必須在下限和上限指示的范圍內(nèi),而其他的指標(biāo)則要求不能超出上限,否則代碼就需要重構(gòu)。
若從指標(biāo)度量圖中發(fā)現(xiàn)某項指標(biāo)不合格,則可雙擊對應(yīng)的檢查點打開文件列表。在打開的文件列表中,可以通過點擊表頭改變排序方式以快速找到指標(biāo)不合格的文件。如下圖所示為按文件名升序進行排序。
找到指標(biāo)不合格的文件,單擊鼠標(biāo)右鍵,然后在右鍵菜單中選擇“Display Function Metrics”打開函數(shù)列表,詳見下圖。
同樣在打開的函數(shù)列表中,可以通過點擊表頭改變排序方式以快速找到指標(biāo)不合格的函數(shù),然后就可以對對應(yīng)的函數(shù)進行重構(gòu)。如下圖所示為按照函數(shù)名稱升進行排序。
2.2.3 修改指標(biāo)閾值
在有些時候,開發(fā)者可能并不希望使用系統(tǒng)默認(rèn)的指標(biāo)閾值,而是希望能夠自定義指標(biāo)閾值。 SourceMonitor 支持對各個指標(biāo)的閾值進行自定義,這樣使用時就會更加靈活。選擇菜單“File→Option”,打開選項設(shè)置對話框。
如果需要修改對應(yīng)語言的閾值,可以選中對應(yīng)的選項卡進行修改即可。詳見下圖。
-
代碼
+關(guān)注
關(guān)注
30文章
4779瀏覽量
68521
發(fā)布評論請先 登錄
相關(guān)推薦
評論