代码的环复杂度(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));elseSystem.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的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

使用工具Source Monitor测量您Java代码的环复杂度相关推荐

  1. 如何计算并测量ABAP及Java代码的环复杂度Cyclomatic complexity

    代码的环复杂度(Cyclomatic complexity,有的地方又翻译成圈复杂度)是一种代码复杂度的衡量标准,在1976年由Thomas J. McCabe, Sr. 提出. 在软件测试的概念里, ...

  2. 使用Source Monitor检测Java代码的环复杂度

    Today I found a useful free software called "SourceMonitor" which can help to calculate an ...

  3. java source folder作用_java项目把源码放到folder里,不是source folder,这个java代码还能被调用吗?...

    看到这个问题,真心觉得初学入门就用IDE真心不是一个好方法.IDE屏蔽了太多基础知识,比如Java是需要编译的,运行的是编译后的class文件.编译命令有编译参数,执行命令有执行命令的参数.还有环境变 ...

  4. java代码质量 圈复杂度,代码圈复杂度(Cyclomatic Complexity,CC)和Oclint工具 介绍...

    什么是代码圈复杂度 圈复杂度是一种度量程序复杂度的方法,由 Thomas McCabe 于 1976年定义,用来衡量一个模块判定结构的复杂程度,数量上表现为独立路径条数,即合理的预防错误所需测试的最少 ...

  5. xml与java代码相互装换的工具类

    2019独角兽企业重金招聘Python工程师标准>>> 这是一个java操作xml文件的工具类,最大的亮点在于能够通过工具类直接生成xml同样层次结构的java代码,也就是说,只要你 ...

  6. java代码混淆器proguard使用大法3种

    ProGuard注意事项 1.反射调用类或者方法,可能失败 2.对外接口的类和方法,不要混淆 3.嵌套类 4.native方法 5.枚举类 https://www.guardsquare.com/en ...

  7. 常见的5种方式看保护java代码(java混淆器)

    在java代码中往往包含着一些非常敏感的信息,有些关系到开发者的利益,有些可能因为使用环境不同而关系到软件用户的利益,于是,java程序是赤膊上阵还是全副武装这个现实问题就摆在了java开发人员的面前 ...

  8. 08从零开始学Java之记事本怎么编写Java代码?

    作者:孙玉昌,昵称[ 一一哥],另外[ 壹壹哥]也是我哦 CSDN博客专家.万粉博主.阿里云专家博主.掘金优质作者 配套开源项目资料 GitHub地址: https://github.com/SunL ...

  9. windows下 Source Monitor代码度量工具的使用

    windows下 Source Monitor代码度量工具的使用 引用链接: https://www.cnblogs.com/xuehanyu/p/4520965.html 1.总体介绍 Source ...

最新文章

  1. Bootstrap按钮
  2. C 入门 第八节 指针
  3. MFC Radio Button 使用 分组 RadioButton 用法
  4. Android Shape Drawable Resources
  5. windows 下安装wamp环境
  6. leetcode22. 括号生成
  7. Java中对象和引用的理解
  8. lamuda表达式 list移除空元素_java8 Lambda表达式遍历并移除元素,报错:ConcurrentModificationException的解决办法...
  9. Java对字符串进行的操作
  10. python 几何计算_计算几何-凸包算法 Python实现与Matlab动画演示
  11. 引入springboot的两种方式以及springboot容器的引入
  12. skyline软件体系及工作流程
  13. 【实战】还记得校内网么(人人网)?当年的同学都在哪?爬取一下就知道
  14. O2O商业模式目前的状态需看透什么?未来会呈现怎样的特征?
  15. 电脑调试UC浏览器,或者本机浏览器
  16. GNU开发工具——WireShark网络分析工具
  17. IT人,更应该要注意保养!!
  18. (OJ)Java面向对象-构造方法
  19. css雪碧图如何调整大小
  20. python字符串取某位_python

热门文章

  1. WebAPI(part5)--排他操作
  2. 回归素材(part7)--机器学习入门到实战-MATLAB实践应用
  3. 125KHz 100cm ID 读卡电路_智能卡制作频率13.25MHZ与125KHZ的区别
  4. SAP BTP SDK for iOS 介绍
  5. Angular单元测试fixture.detectChanges()
  6. SAP Spartacus Org Unit明细页面的设计原理
  7. Slack设置根据关键字自动提醒的小技巧
  8. SAP Spartacus支持的语言和货币单位的数据源
  9. 如何在Cloud for Customer overview UI上扩展新的按钮
  10. SAP GUI是如何启动本地安装的office word应用的