摘要:代码的环复杂度,有时也翻译成圈复杂度是一种代码复杂度的衡量标准,在年由提出。好消息是,有一款名为的免费软件,能够帮我们来度量代码的环复杂度。很快就将我们指定的文件的环复杂度计算完毕。
代码的环复杂度(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 ArrayListmonthCollection = 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)); 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的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/71750.html
摘要:代码的环复杂度,有的地方又翻译成圈复杂度是一种代码复杂度的衡量标准,在年由提出。圈复杂度大说明程序代码可能质量低且难于测试和维护。 代码的环复杂度(Cyclomatic complexity,有的地方又翻译成圈复杂度)是一种代码复杂度的衡量标准,在1976年由Thomas J. McCabe, Sr. 提出。 在软件测试的概念里,圈复杂度用来衡量一个模块判定结构的复杂程度,数量上表现为...
摘要:目前被广泛用于和的众多应用中,以及和一些正在开发的新一代云产品中。年月时,我和德国一位负责的同事就这个话题在半小时的电话会议里产生了争执。德国同事看了之后,同意了我的意见。和微信集成系列教程这个系列教程里,和微信的交互,使用了,使用了。 OData(Open Data Protocol)协议是一个开放的工业标准,用于定义RESTFul API的设计和使用。我的文章标题前加上SAP的前缀...
摘要:目前被广泛用于和的众多应用中,以及和一些正在开发的新一代云产品中。年月时,我和德国一位负责的同事就这个话题在半小时的电话会议里产生了争执。德国同事看了之后,同意了我的意见。和微信集成系列教程这个系列教程里,和微信的交互,使用了,使用了。 OData(Open Data Protocol)协议是一个开放的工业标准,用于定义RESTFul API的设计和使用。我的文章标题前加上SAP的前缀...
阅读 2061·2021-10-12 10:11
阅读 825·2021-10-09 09:41
阅读 3712·2021-09-09 11:37
阅读 1914·2021-09-08 10:41
阅读 2616·2019-08-30 12:58
阅读 2349·2019-08-30 10:58
阅读 1246·2019-08-26 13:40
阅读 4028·2019-08-26 13:36