代码的环复杂度(Cyclomatic complexity,有时也翻译成圈复杂度)是一种代码复杂度的衡量标准,在1976年由Thomas J. McCabe, Sr. 提出。
来看看计算公式。
代码环复杂度 = E − N + 2
E = 程序控制流图中边的个数
N = 程序控制流图中点的个数
很容易得出这样的结论:代码环复杂度越高,越容易出bug。
可以想象如果需要开发人员自己去把一段代码的控制流图画出来,然后去数图中边和点的个数,这种做法效率太低了也容易出错。
好消息是,有一款名为Source Monitor的免费软件,能够帮我们来度量Java代码的环复杂度。当然这款软件也支持C++和C#。
为了说明如何使用这款软件,我写了一段简单的Java代码。
package test;
import java.util.ArrayList;
public class monthTool {
static ArrayList<String> monthCollection = new ArrayList<String>();
public static void main(String[] args) {
monthTool tool = new monthTool();
tool.printV1(1);
tool.printV2(2);
tool.printV1(0);
tool.printV2(-1);
tool.printV3(3);
tool.printV3(13);
}
public monthTool(){
monthCollection.add("Invalid");
monthCollection.add("January");
monthCollection.add("Febrary");
monthCollection.add("March");
monthCollection.add("April");
monthCollection.add("May");
monthCollection.add("June");
monthCollection.add("July");
monthCollection.add("August");
monthCollection.add("September");
monthCollection.add("October");
monthCollection.add("November");
monthCollection.add("December");
}
public void printV1(int month){
System.out.println("Month is: " + getMonthNameV1(month));
}
public void printV2(int month){
if( month >= 1 && month <= 12)
System.out.println("Month is: " + getMonthNameV2(month));
else
System.out.println("Please specify a valid month");
}
public void printV3(int month) {
System.out.println("Month is: " + getMonthNameV3(month));
}
public String getMonthNameV2(int month){
if( month == 1)
return "January";
else if( month == 2)
return "Febrary";
else if( month == 3)
return "March";
else if( month == 4)
return "April";
else if( month == 5)
return "May";
else if( month == 6)
return "June";
else if( month == 7)
return "July";
else if( month == 8)
return "August";
else if( month == 9)
return "September";
else if( month == 10)
return "October";
else if( month == 11)
return "November";
else if( month == 12)
return "December";
elsereturn "Invalid";
}
public String getMonthNameV1(int month){
switch (month){
case 1:
return "January";
case 2:
return "Febrary";
case 3:
return "March";
case 4:
return "April";
case 5:
return "May";
case 6:
return "June";
case 7:
return "July";
case 8:
return "August";
case 9:
return "September";
case 10:
return "October";
case 11:
return "November";
case 12:
return "December";
default:
return "Invalid";
}
}
public String getMonthNameV3(int month){
try {
return monthCollection.get(month);
}
catch (java.lang.IndexOutOfBoundsException e){
return "Invalid";
}
}
}
其中我用了三种不同的方式实现了同一个逻辑,将一个代表月份的整数转成了月份名称。
下面是Source Monitor的具体用法。
1. 创建一个新的项目:
这里能看到所有Source Monitor支持的编程语言。
2. 指定您本地的Java项目文件地址:
3. 指定您的Java项目文件夹内,您希望SourceMonitor计算哪些Java文件的环复杂度。
4. 点OK,就可以开始扫描啦。
很快Source Monitor就将我们指定的Java文件的环复杂度计算完毕。点击菜单“Display Method Metrics”来查看结果:
从环复杂度扫描结果能看出,明显第三种从月份名称集合里通过ArrayList自带的get方法取得月份名称是最优的解法——环复杂度仅为2。
也可以通过图表的方式更直观得看到方法的环复杂度比较:
X轴的值代表每个方法的环复杂度,Y轴代表这些环复杂度的不同值出现的次数。
比如下图的意思是,环复杂度为1的方法(X轴刻度为1的节点)共有4个(Y轴刻度为4),环复杂度为2的方法(X轴刻度为2的节点)有1个(Y轴刻度为1)。以此类推。
要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:
相关推荐
安装完成后,可以通过桌面快捷方式启动SourceMonitor.exe来开始使用。 2. **项目导入**:Source Monitor支持多种编程语言,如C、C++、Java、VB等。用户可以选择需要分析的项目文件或整个目录,软件会自动扫描并加载...
在实际应用中,Source Monitor的圈复杂度功能可以与代码审查、持续集成和静态代码分析工具结合使用,形成一套完整的代码质量管理流程。通过定期检查和分析圈复杂度,开发团队可以持续改进代码库,保持代码的清晰和...
**SourceMonitor:代码复杂度分析神器** SourceMonitor是一款广受欢迎的源代码分析工具,尤其在软件开发领域,它被用来衡量代码的复杂性、维护性和可读性。这款工具能够帮助开发者有效地理解和评估项目的代码质量,...
通过提供详细的代码统计信息,如代码行数、注释比例、复杂度等,SourceMonitor使得代码审查、代码质量管理以及项目估算等工作变得更加便捷。在软件开发过程中,了解代码的复杂性至关重要,因为它直接影响到代码的...
4. 查看结果:分析完成后,SourceMonitor将显示详细的统计信息,包括代码行数、复杂度等。 5. 生成报告:如果需要,可以导出分析结果为HTML或其他格式的报告,如"说明_Readme.html",方便共享和存档。 **总结** ...
总的来说,"SOURCE MONITOR V323"是一款强大的代码复杂度分析工具,对于任何希望改善代码质量和提升开发效率的团队来说,都是一个不可或缺的利器。通过其详尽的分析报告和直观的界面,开发者能够更好地理解代码结构...
Source Monitor 可以从官方网站 <http://www.campwoodsw.com/sourcemonitor.html> 下载。下载完成后,按照常规步骤进行安装。安装过程中无需特殊设置,只需按照向导指示进行即可。 ### 2. 创建项目与设置 安装完成...
1. **代码统计**:SourceMonitor可以精确地统计项目中每种语言(如C++、Java、C#等)的源代码行数,包括实际代码行、注释行以及空行。这对于项目管理和成本估算非常有价值。 2. **复杂性分析**:工具能够计算每个类...
SourceMonitor提供了丰富的功能,如代码行统计、函数计数、循环复杂度分析等,从而有效地提升软件开发的效率和质量。 1. **代码行统计** SourceMonitor可以详细地统计项目中的代码行数,包括注释行、空行、实际...
使用SourceMonitor进行代码审查,有助于提升代码质量,减少潜在的错误和漏洞。它可以帮助开发者遵循最佳实践,提高代码的可读性和可维护性。同时,通过定期的代码分析,团队可以持续跟踪项目的健康状况,及时发现并...
SourceMonitor是一款功能强大的代码行统计工具,主要用于测试多种编程语言(包括但不限于C++、C、C#、VB.net、Java、Delphi、VisualBasic和HTML)的源代码文件,并提供代码数量和性能的数据分析。它不仅可以帮助...
SourceMonitor可以为C++、C、C#、VB.net、Java、Delphi、Visual Basic和HTML的源代码文件测试...SourceMonitor除去常规的代码规模统计外,可以统计出代码的复杂度,嵌套深度、类个数等度量数据,方便对项目进行重构。
3. **SourceMonitor**:这是一款代码度量工具,可以统计代码行数、计算复杂度等,帮助开发者评估项目规模、跟踪代码变化。虽然不是Source Insight原生的一部分,但与之配合使用,可以更全面地了解项目的状态。 接...
SonarQube 不仅可以提供基本的代码行数统计,还可以进行代码质量分析,包括检测潜在的代码缺陷、重复代码、代码复杂度等。 总的来说,统计源代码行数及有效代码是一项重要的软件工程任务,可以帮助开发者了解项目...
- 代码统计工具可能基于命令行界面,如Linux的`wc`命令,或者通过图形用户界面(GUI)实现,如SourceMonitor、CLOC等。这些工具通常支持多种编程语言,并提供批量处理和自定义规则的功能。 9. **代码质量管理**: ...
例如,一些知名的代码行计数工具包括CLOC(Count Lines of Code)、SLOCCount、SourceMonitor等。它们都提供了类似的特性和功能,开发者可以根据项目需求选择合适的工具。在实际使用时,应结合其他软件质量指标,如...