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

使用工具Source Monitor测量您Java代码的环复杂度的更多相关文章

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

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

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

    这是一个java操作xml文件的工具类,最大的亮点在于能够通过工具类直接生成xml同样层次结构的java代码,也就是说,只要你定义好了xml的模板,就能一键生成java代码.省下了自己再使用工具类写代 ...

  3. Java代码质量度量工具大阅兵

    FindBugs FindBugs, a program which uses static analysis to look for bugs in Java code. It is free so ...

  4. eclipse Java代码折叠工具

      eclipse Java代码折叠工具 CreateTime--2018年5月17日15点09分 Author:Marydon 1.问题描述 eclipse自带的代码折叠工具,无法折叠try{}ca ...

  5. Java静态检测工具/Java代码规范和质量检查简单介绍(转)

    静态检查: 静态测试包括代码检查.静态结构分析.代码质量度量等.它可以由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行.代码检查代码检查包括代码走查.桌面检查.代码审查等,主要检查代码 ...

  6. 001 发大招了 神奇的效率工具--Java代码转python代码

    今天发现一个好玩的工具: 可以直接将java转成python 1. 安装工具(windows 环境下面) 先下载antlr: 下载链接如下: http://www.antlr3.org/downloa ...

  7. Source Insight 中使用 AStyle 代码格式工具

    Source Insight 中使用 AStyle 代码格式工具 彭会锋 2015-05-19 23:26:32     Source Insight是较好的代码阅读和编辑工具,不过source in ...

  8. 四种java代码静态检查工具

    [转载]常用 Java 静态代码分析工具的分析与比较 转载自 开源中国社区 http://www.oschina.net/question/129540_23043       1月16日厦门 OSC ...

  9. Java代码混淆工具ProGuard

    目录 Java代码混淆工具ProGuard 简介 描述 作用的环境 功能 工作原理 下载 使用时注意事项 版本问题 JDK位数问题 Java的字节码验证问题 关于使用类似于Hibernate的对象关系 ...

随机推荐

  1. 删除ue4中c++类

    http://gad.qq.com/program/translateview/7190281 删除一个C++类 该方法是从UE4的answerhub上摘选的.本教程介绍了从项目中删除一个C++类所需 ...

  2. Hadoop 2.7.3 HA 搭建及遇到的一些问题

    看了Hadoop的一个7天视频教程,里面给出了搭建的详细步骤,教程中是按2.4.1版本搭建的,我用的是2.7.3版本,好像没什么差别.下面是抄过来的,加了一点注释. hadoop2.0已经发布了稳定版 ...

  3. 深入Java集合学习系列:HashSet的实现原理

    1. HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特别是它不保证该顺序恒久不变.此类允许使用null元素. 2. H ...

  4. 黑马SSM练习中 Oracle SQL代码

    -- 10张表 product member orders traveller order_traveller users role permission users_role role_permis ...

  5. CentOS6.7 i686上安装JDK7

    内核版本: [root@heima01 java]# uname -a Linux heima01 2.6.32-573.el6.i686 #1 SMP Thu Jul 23 12:37:35 UTC ...

  6. [BeiJing wc2012]连连看

    题目链接 费用流板子+拆点 #include <bits/stdc++.h> using namespace std; typedef long long ll; inline int r ...

  7. css布局全总结

    一  居 中 布 局 水平居中 1. 使用inline-block+text-align(1)原理.用法 原理:先将子框由块级元素改变为行内块元素,再通过设置行内块元素居中以达到水平居中. 用法:对子 ...

  8. Python网络编程之基础

    计算机网络基础 网络到底是什么?计算机之间如何通信的? 早期:联机 以太网:局域网与交换机 ******广播 主机之间“一对所有”的通讯模式,网络对其中每一台主机发出的信号都进行无条件复制并转发, 所 ...

  9. Hive进阶_内置函数

    Hive数学函数 round : 四舍五入 ceil : 向下取整 floor : 向上取整 ),),),),); Hive字符函数 select lower('Hello World'), uppe ...

  10. Sam's Numbers 矩阵快速幂优化dp

    https://www.hackerrank.com/contests/hourrank-21/challenges/sams-numbers 设dp[s][i]表示产生的总和是s的时候,结尾符是i的 ...