1 代码结构分析概述
在编写代码时,要求要结构清晰、接口简单。如果代码结构过于复杂,会带来很多问题:代码很难被理解,不方便编写测试用例,容易隐藏错误,出现问题难以定位,修改代码容易产生新的Bug等等。因此,需要有一些指标来评估代码的复杂度,以方便对过于复杂的代码进行重构。
代码的复杂度通常可通过以下几个指标来评估:
总行数:包括注释以及空行在内的代码行数;
语句数目:有效的语句行数,包括#include、#define、#undef 这三个预处理命令在内,括号不包含在内;
分支语句比例:分支语句占总语句数目的比例;
注释比例:注释占总行数的比例;
函数数目:函数的数量;
平均每个函数的语句数;
函数圈复杂度;
函数最大嵌套层数;
类的数量;
平均每个类的函数数量。
2 基于的SourceMonitor代码结构检查
当前能够进行代码结构检查的工具有不少,本文中选择 SourceMonitor 作为代码结构检查工具。
2.1 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”,打开选项设置对话框。
如果需要修改对应语言的阈值,可以选中对应的选项卡进行修改即可。详见图Figure 2 14。
欢迎访问我的网站
BruceOu的哔哩哔哩
BruceOu的主页
BruceOu的博客
BruceOu的CSDN博客
BruceOu的简书
BruceOu的知乎