代码的环复杂度(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";
else
return "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的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:
相关推荐
通过检查关键的编程指标,如圈复杂度(Cyclomatic Complexity)和代码深度注释率,Source Monitor提供了一种量化的方式来识别代码中的潜在问题,从而优化代码结构,降低维护成本。 **一、圈复杂度** 圈复杂度是...
总结来说,SourceMonitor是一款强大的代码复杂度查看工具,它通过量化代码的复杂性,帮助开发者更好地理解代码结构,优化代码质量,提升软件工程的效率和可靠性。无论是个人开发者还是团队,都值得将SourceMonitor...
在实际应用中,Source Monitor的圈复杂度功能可以与代码审查、持续集成和静态代码分析工具结合使用,形成一套完整的代码质量管理流程。通过定期检查和分析圈复杂度,开发团队可以持续改进代码库,保持代码的清晰和...
SourceMonitor是一款广受欢迎的代码检查工具,专为开发者设计,用于度量和分析源代码的复杂性。它支持多种编程语言,包括但不限于C、C++、C#、Java、VB.NET、JavaScript、PHP等。这款工具的核心功能在于帮助开发人员...
SourceMonitor,免费代码统计工具,圈复杂度,代码数量,覆盖率等等
总的来说,SourceMonitor通过提供圈复杂度等关键指标,为开发者提供了一种量化评估代码复杂性的工具,从而有助于提升软件项目的质量和可维护性。通过定期使用SourceMonitor,开发团队可以及时发现并修复可能导致问题...
1. **代码复杂性测量**:SourceMonitor可以分析源代码的复杂性,包括函数的深度、循环和嵌套结构。复杂性高的代码往往更难理解和维护,因此,这一功能对于识别潜在问题和优化代码至关重要。 2. **代码覆盖率**:该...
SourceMonitor是一款强大的源代码分析工具,专为软件开发者设计,用于度量和管理代码的复杂性。它能够帮助程序员有效地进行代码重构,提升代码质量和可维护性。通过深入剖析代码,SourceMonitor提供了一系列关键指标...
总的来说,"SOURCE MONITOR V323"是一款强大的代码复杂度分析工具,对于任何希望改善代码质量和提升开发效率的团队来说,都是一个不可或缺的利器。通过其详尽的分析报告和直观的界面,开发者能够更好地理解代码结构...
**SourceMonitor:强大的代码分析与度量工具** SourceMonitor是一款高效且全面的代码审查工具,专为软件开发人员设计,支持多种编程语言,包括C++、C#、Java、Delphi、Visual Basic以及HTML。这款工具的核心功能...
在软件工程测试领域,SourceMonitor是一款不可或缺的代码分析工具。它主要用于度量和管理软件项目的源代码,帮助开发者和测试人员了解代码的质量、复杂性和可维护性。SourceMonitor提供了丰富的功能,如代码行统计、...
Source Monitor 是一款强大的源代码分析工具,尤其在软件测试领域中,它被广泛用于度量和评估代码的质量。本实验报告旨在介绍如何使用 Source Monitor 对源代码进行度量,并理解其提供的各项指标,以帮助提升软件...
强大的代码统计工具,支持多种格式的代码统计,附教程
SourceMonitor是一款用于代码复杂度分析的工具,它可以自动计算上述各种复杂度指标,帮助软件开发者和测试团队了解代码的健康状况,优化代码结构,提高软件质量,降低维护成本。通过对软件复杂度的深入理解和有效...
利用SourceMonitor可以为C++、C、C#、Java、Delphi、Visual Basic和HTML的源代码文件测试代码数量和性能。最终结果可以描绘成图、输出打印。
源代码统计工具SourceCount是一款非常实用的软件,它专为开发者设计,用于高效地分析和统计项目中的代码结构。在软件开发过程中,了解代码的组成是至关重要的,它可以帮助我们评估项目的规模,优化代码质量,以及...
早就听说了微软内部的静态代码检查和代码强制格式美化工具 StyleCop)不是代码格式化(代码美化)工具,而是代码规范检查工具(Code Review 工具),它不仅仅检查代码格式,而是编码规范,包括命名和注释等。...
SourceMonitor (TM) Version 3.5 Campwood Software LLC, Burlington, ...利用SourceMonitor可以为C++、C、C#、Java、Delphi、Visual Basic和HTML的源代码文件测试代码数量和性能。最终结果可以描绘成图、输出打印。