博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用工具Source Monitor测量您Java代码的环复杂度
阅读量:6495 次
发布时间:2019-06-24

本文共 2937 字,大约阅读时间需要 9 分钟。

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

转载地址:http://yauyo.baihongyu.com/

你可能感兴趣的文章
CentOS7像外部163邮箱发送邮件
查看>>
UOJ#34 FFT模板题
查看>>
Xshell和VirtualBox虚机CentOS7的连接
查看>>
动态的改变程序的主题
查看>>
解析xml文件
查看>>
使用阿富汗和巴基斯坦地区的SRTM数据生成山体阴影和彩色地形图
查看>>
android Button ImageButton 区别
查看>>
intellij IDEA常见操作
查看>>
微信5.0打飞机怎么取得高分?
查看>>
lua编程注意杂项
查看>>
2.28考试小记
查看>>
旧工程适配iOS6和iPhone5的一些故事
查看>>
QQ简易版
查看>>
12-python-集合
查看>>
Java NIO学习笔记九 NIO与IO对比
查看>>
Python 面试总结
查看>>
2012我国各地云计算产业发展规划盘点
查看>>
两栏布局
查看>>
6、常用类简介
查看>>
js 操作dom
查看>>