圈复杂度(Cyclomatic Complexity)是一种代码复杂度的衡量标准。它可以用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,也可理解为覆盖所有的可能情况最少使用的测试用例数。圈复杂度大说明程序代码的判断逻辑复杂,可能质量低且难于测试和维护。程序的可能错误和高的圈复杂度有着很大关系。

下面这个实例中,单元测试的覆盖率可以达到100%,但是很容易发现这其中已经漏掉了一个NPE的测试用例。case1方法的圈复杂度为2,因此至少需要2个用例才能完全覆盖到其所有的可能情况。

//程序原代码,圈复杂度为 2

public String case1(int num) {

String string = null;

if (num == 1) {

string = "String";

}

return string.substring(0);

}

//上面代码的单元测试代码

public void testCase1(){

String test1 = case1(1);

}

圈复杂度主要与分支语句(if、else、,switch 等)的个数成正相关。可以在图1中看到常用到的几种语句的控制流图(表示程序执行流程的有向图)。当一段代码中含有较多的分支语句,其逻辑复杂程度就会增加。在计算圈复杂度时,可以通过程序控制流图方便的计算出来。通常使用的计算公式是V(G) = e – n + 2 , e 代表在控制流图中的边的数量(对应代码中顺序结构的部分),n 代表在控制流图中的节点数量,包括起点和终点(1、所有终点只计算一次,即便有多个return或者throw;2、节点对应代码中的分支语句)。

图1、各判断语句的控制流图

知道了如何计算圈复杂度,我们来使用控制流图重新计算一次case1方法的圈复杂度,其控制流图如下图。状态1表示if(num == 1 )的条件判断,状态2表示string=”String”的赋值操作。可以通过下面的控制流图得到 e = 3 ; n = 3;那么全复杂度V(G) = 3 - 3 + 2 = 2,既case1的圈复杂度为2。

图2、case1的控制流图

在看一个计算全复杂度的例子。程序代码如下:

public String case2(int index, String string) {

String returnString = null;

if (index < 0) {

throw new IndexOutOfBoundsException("exception <0 ");

}

if (index == 1) {

if (string.length() < 2) {

return string;

}

returnString = "returnString1";

else if (index == 2) {

if (string.length() < 5) {

return string;

}

returnString = "returnString2";

else {

throw new IndexOutOfBoundsException("exception >2 ");

}

return returnString;

}

程序控制流图:

图3、case2的控制流图

根据公式 V(G) = e – n + 2 = 12 – 8 + 2 = 6 。case2的圈复杂段为6。说明一下为什么n = 8,虽然图上的真正节点有12个,但是其中有5个节点为throw、return,这样的节点为end节点,只能记做一个。

在开发中常用的检测圈复杂度的工具,PMD,checkstyle都可以检测到高复杂度的代码块。在代码的开发中,配合各种圈复杂度的检测插件,将高复杂度的代码进行适当的拆分、优化,可以大大提高代码整体的质量,减少潜在bug存在。

转载于:https://www.cnblogs.com/milo-hu/p/3850602.html

圈复杂度(Cyclomatic Complexity)-转相关推荐

  1. 圈复杂度Cyclomatic complexity

    一.什么是圈复杂度 圈复杂度(Cyclomatic complexity,简写 CC)也称为条件复杂度,是模块结构复杂度的度量,数量上表现为独立路径的条数,即合理的预防错误所需测试的最少路径条数. 成 ...

  2. 优化圈复杂度(Cyclomatic complexity, CC)

    圈复杂度(Cyclomatic complexity, CC) 简介 圈复杂度(Cyclomatic complexity,简写CC)也称为条件复杂度,是一种代码复杂度的衡量标准.在很多公司内上线代码 ...

  3. #圈复杂度 - Cyclomatic Complexity

    ##概念 循环复杂度(Cyclomatic complexity)也称为条件复杂度,是一种软件度量,是由老托马斯·J·麦凯布(英语:Thomas J. McCabe, Sr.) 在1976年提出,用来 ...

  4. 圈复杂度 Cyclomatic complexity 介绍

    背景 代码的可测试性和可维护性是非常重要的,比如,下面的代码: 只是输出简单的"Hello, world", 大家都不会否认这个代码写得太复杂太难维护了.那么,有没有什么度量指标来 ...

  5. 圈复杂度 (Cyclomatic Complexity)

    概念 圈复杂度也称条件复杂度,是一种衡量代码复杂度的标准.它可以用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,也可以理解为覆盖所有情况最少使用的测试用例数.圈复杂度大说明程序代码的 ...

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

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

  7. 如何降低前端代码圈复杂度?

    作者 | ConardLi 责编 | maozz 出品 | CSDN(ID:CSDNnews) 写程序时时刻记着,这个将来要维护你写的程序的人是一个有严重暴力倾向,并且知道你住在哪里的精神变态者. 导 ...

  8. java中的圈复杂度计算_[代码质量] 圈复杂度和代码质量优化(附带示例代码纠正代码质量)...

    什么是圈复杂度? --------------------------------------- 圈复杂度(Cyclomatic Complexity)是衡量计算机程序复杂程度的一种措施.它根据程序从 ...

  9. 圈复杂度详解以及解决圈复杂度常用的方法

    1.什么是代码圈复杂度? 圈复杂度(Cyclomatic Complexity)是一种代码复杂度的衡量标准,由 Thomas McCabe 于 1976年定义.它可以用来衡量一个模块判定结构的复杂程度 ...

  10. 质量管理之代码的圈复杂度

    首先,我们要知道,圈复杂度是什么? 圈复杂度(Cyclomatic complexity)是一种代码复杂度的衡量标准,在1976年由Thomas J. McCabe, Sr. 提出. 在软件测试的概念 ...

最新文章

  1. JavaScript 工作原理之十一-渲染引擎及性能优化小技巧
  2. 用DHCP实现网关配置和DNS解析
  3. sockaddr与sockaddr_in的区别
  4. 【转】VS中常用图标提示含义
  5. iOS 两种方法实现左右滑动出现侧边菜单栏 slide view
  6. cocos2dx 圆盘抽奖_【cocos2dx 3.3 lua】06 抽奖转盘效果
  7. 生产环境的分布式任务调度框架如何选择?quartz、xxl-job、Elastic-Job、Saturn
  8. 增加特征对预测准确率的影响
  9. 【ML小结2】信息论
  10. QAM调制原理_锁相环(PLL)基本原理 PLL电路常见构建模块
  11. linux mysql导出表中的数据_MySQL导出指定表中的数据
  12. 找不到Break键怎么Quit / 退出服务CTRL-BREAK怎么输入啊?/ 笔记本键盘上没有break键
  13. Windows 10日语输入法无法输入假名问题
  14. java编写数独计算器
  15. 测试工程师职业要求汇总(转)
  16. 慢慢的长大,慢慢的成长
  17. Linux CentOS 7 下载安装
  18. 【unknow ssid】两种办法获取WIFI名称99%可解决
  19. np.load()读取npy文件
  20. 小小白学习c语言分享

热门文章

  1. 5.4 Components -- Wrapping Content in A Component(在组件中包裹内容)
  2. AMD Fusion 开发者峰会透漏的信息
  3. 安装IIS服务 找不到staxmem.dll文件的解决方法
  4. ARP解决方法/工具+真假ARP防范区别方法+ARP终极解决方案
  5. mysql 数据库隔离级别_彻底搞懂mysql数据库四种隔离级别,实验实战
  6. 到底如何调用Async异步函数
  7. 7.监控应用和数据可视化 7.1通用健康状态指引器
  8. Hibernate集合属性的元素为组件(三)
  9. 【渝粤教育】国家开放大学2019年春季 2718动物生理基础 参考试题
  10. debtorpmandrpmtodeb