圈复杂度(Cyclomatic Complexity)-转
圈复杂度(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)-转相关推荐
- 圈复杂度Cyclomatic complexity
一.什么是圈复杂度 圈复杂度(Cyclomatic complexity,简写 CC)也称为条件复杂度,是模块结构复杂度的度量,数量上表现为独立路径的条数,即合理的预防错误所需测试的最少路径条数. 成 ...
- 优化圈复杂度(Cyclomatic complexity, CC)
圈复杂度(Cyclomatic complexity, CC) 简介 圈复杂度(Cyclomatic complexity,简写CC)也称为条件复杂度,是一种代码复杂度的衡量标准.在很多公司内上线代码 ...
- #圈复杂度 - Cyclomatic Complexity
##概念 循环复杂度(Cyclomatic complexity)也称为条件复杂度,是一种软件度量,是由老托马斯·J·麦凯布(英语:Thomas J. McCabe, Sr.) 在1976年提出,用来 ...
- 圈复杂度 Cyclomatic complexity 介绍
背景 代码的可测试性和可维护性是非常重要的,比如,下面的代码: 只是输出简单的"Hello, world", 大家都不会否认这个代码写得太复杂太难维护了.那么,有没有什么度量指标来 ...
- 圈复杂度 (Cyclomatic Complexity)
概念 圈复杂度也称条件复杂度,是一种衡量代码复杂度的标准.它可以用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,也可以理解为覆盖所有情况最少使用的测试用例数.圈复杂度大说明程序代码的 ...
- 如何计算并测量ABAP及Java代码的环复杂度Cyclomatic complexity
代码的环复杂度(Cyclomatic complexity,有的地方又翻译成圈复杂度)是一种代码复杂度的衡量标准,在1976年由Thomas J. McCabe, Sr. 提出. 在软件测试的概念里, ...
- 如何降低前端代码圈复杂度?
作者 | ConardLi 责编 | maozz 出品 | CSDN(ID:CSDNnews) 写程序时时刻记着,这个将来要维护你写的程序的人是一个有严重暴力倾向,并且知道你住在哪里的精神变态者. 导 ...
- java中的圈复杂度计算_[代码质量] 圈复杂度和代码质量优化(附带示例代码纠正代码质量)...
什么是圈复杂度? --------------------------------------- 圈复杂度(Cyclomatic Complexity)是衡量计算机程序复杂程度的一种措施.它根据程序从 ...
- 圈复杂度详解以及解决圈复杂度常用的方法
1.什么是代码圈复杂度? 圈复杂度(Cyclomatic Complexity)是一种代码复杂度的衡量标准,由 Thomas McCabe 于 1976年定义.它可以用来衡量一个模块判定结构的复杂程度 ...
- 质量管理之代码的圈复杂度
首先,我们要知道,圈复杂度是什么? 圈复杂度(Cyclomatic complexity)是一种代码复杂度的衡量标准,在1976年由Thomas J. McCabe, Sr. 提出. 在软件测试的概念 ...
最新文章
- JavaScript 工作原理之十一-渲染引擎及性能优化小技巧
- 用DHCP实现网关配置和DNS解析
- sockaddr与sockaddr_in的区别
- 【转】VS中常用图标提示含义
- iOS 两种方法实现左右滑动出现侧边菜单栏 slide view
- cocos2dx 圆盘抽奖_【cocos2dx 3.3 lua】06 抽奖转盘效果
- 生产环境的分布式任务调度框架如何选择?quartz、xxl-job、Elastic-Job、Saturn
- 增加特征对预测准确率的影响
- 【ML小结2】信息论
- QAM调制原理_锁相环(PLL)基本原理 PLL电路常见构建模块
- linux mysql导出表中的数据_MySQL导出指定表中的数据
- 找不到Break键怎么Quit / 退出服务CTRL-BREAK怎么输入啊?/ 笔记本键盘上没有break键
- Windows 10日语输入法无法输入假名问题
- java编写数独计算器
- 测试工程师职业要求汇总(转)
- 慢慢的长大,慢慢的成长
- Linux CentOS 7 下载安装
- 【unknow ssid】两种办法获取WIFI名称99%可解决
- np.load()读取npy文件
- 小小白学习c语言分享
热门文章
- 5.4 Components -- Wrapping Content in A Component(在组件中包裹内容)
- AMD Fusion 开发者峰会透漏的信息
- 安装IIS服务 找不到staxmem.dll文件的解决方法
- ARP解决方法/工具+真假ARP防范区别方法+ARP终极解决方案
- mysql 数据库隔离级别_彻底搞懂mysql数据库四种隔离级别,实验实战
- 到底如何调用Async异步函数
- 7.监控应用和数据可视化 7.1通用健康状态指引器
- Hibernate集合属性的元素为组件(三)
- 【渝粤教育】国家开放大学2019年春季 2718动物生理基础 参考试题
- debtorpmandrpmtodeb