质量管理之代码的圈复杂度
首先,我们要知道,圈复杂度是什么?
圈复杂度(Cyclomatic complexity)是一种代码复杂度的衡量标准,在1976年由Thomas J. McCabe, Sr. 提出。
在软件测试的概念里,圈复杂度用来衡量一个模块判定结构的复杂程度,数量上表现为线性无关的路径条数,即合理的预防错误所需测试的最少路径条数。圈复杂度大说明程序代码可能质量低且难于测试和维护,根据经验,程序的可能错误和高的圈复杂度有着很大关系。
如果一段源码中不包含控制流语句(条件或决策点),那么这段代码的圈复杂度为1,因为这段代码中只会有一条路径;如果一段代码中仅包含一个if语句,且if语句仅有一个条件,那么这段代码的圈复杂度为2;包含两个嵌套的if语句,或是一个if语句有两个条件的代码块的圈复杂度为3。
一,计算方法有三种:
计算公式1:
V(G)=e-n+2p。其中,e表示控制流图中边的数量,n表示控制流图中节点的数量,p图的连接组件数目(图的组件数是相连节点的最大集合)。因为控制流图都是连通的,所以p为1.
计算公式2:
V(G)=区域数=判定节点数+1。其实,圈复杂度的计算还有更直观的方法,因为圈复杂度所反映的是“判定条件”的数量,所以圈复杂度实际上就是等于判定节点的数量再加上1,也即控制流图的区域数。
对于多分支的CASE结构或IF-ELSEIF-ELSE结构,统计判定节点的个数时需要特别注意一点,要求必须统计全部实际的判定节点数,也即每个ELSEIF语句,以及每个CASE语句,都应该算为一个判定节点。
节点通常包括 :
- if 语句
- while 语句
- for 语句
- case 语句
- catch 语句
- and 和 or 布尔操作
- ? : 三元运算符
计算公式3:
V(G)=R。其中R代表平面被控制流图划分成的区域数。
针对程序的控制流图计算圈复杂度V(G)时,最好还是采用第一个公式,也即V(G)=e-n+2;而针对模块的控制流图时,可以直接统计判定节点数,这样更为简单;针对复杂的控制流图是,使用区域计算公式V(G)=R更为简单。
简单来说,程序的可能错误和高的圈复杂度有着很大关系,圈复杂度最高的模块和方法,其缺陷个数也可能最多。
圈复杂度大说明程序代码的判断逻辑复杂,可能质量低,且难于测试和维护。
二,评判标准:
常见功能代码通常可以把圈复杂度控制在<=10。而>30的代码通常在CR阶段就会被打回重构。
三,降低圈复杂度的方法
常用的方法有:
- 简化、合并条件表达式
- 将条件判定提炼出独立函数
- 将大函数拆成小函数
- 以明确函数取代参数
- 替换算法
质量管理之代码的圈复杂度相关推荐
- java代码质量 圈复杂度,代码圈复杂度(Cyclomatic Complexity,CC)和Oclint工具 介绍...
什么是代码圈复杂度 圈复杂度是一种度量程序复杂度的方法,由 Thomas McCabe 于 1976年定义,用来衡量一个模块判定结构的复杂程度,数量上表现为独立路径条数,即合理的预防错误所需测试的最少 ...
- 前端代码质量-圈复杂度原理和实践
写程序时时刻记着,这个将来要维护你写的程序的人是一个有严重暴力倾向,并且知道你住在哪里的精神变态者. 1. 导读 你们是否也有过下面的想法? 重构一个项目还不如新开发一个项目... 这代码是谁写的,我 ...
- java中的圈复杂度计算_[代码质量] 圈复杂度和代码质量优化(附带示例代码纠正代码质量)...
什么是圈复杂度? --------------------------------------- 圈复杂度(Cyclomatic Complexity)是衡量计算机程序复杂程度的一种措施.它根据程序从 ...
- 追求代码质量: 监视圈复杂度
http://www.ibm.com/developerworks/cn/java/j-cq03316/ 每位开发人员对代码质量的含义都有着自己的看法,并且大多数人对如何查找编写欠佳的代码也有自己的想 ...
- 代码质量度量标准_追求代码质量(2): 监视圈复杂度
每位开发人员对代码质量的含义都有着自己的看法,并且大多数人对如何查找编写欠佳的代码也有自己的想法.甚至术语代码味道(code smell) 也已进入大众词汇表,成为描述代码需要改进的一种方式. 代码味 ...
- 如何降低前端代码圈复杂度?
作者 | ConardLi 责编 | maozz 出品 | CSDN(ID:CSDNnews) 写程序时时刻记着,这个将来要维护你写的程序的人是一个有严重暴力倾向,并且知道你住在哪里的精神变态者. 导 ...
- 利用Java反射机制降低代码圈复杂度
利用Java反射机制降低代码圈复杂度 在实际的工作中,我遇到了项目里老代码存在圈复杂度过高的问题,在提交代码的时候通不过CI(代码检查)的Lizard复杂度检查,所以迫切需要解决这个问题,运用Java ...
- java 圈复杂度_追求代码质量: 监视圈复杂度
每位开发人员对代码质量的含义都有着自己的看法,并且大多数人对如何查找编写欠佳的代码也有自己的想法.甚至术语代码味道(code smell) 也已进入大众词汇表,成为描述代码需要改进的一种方式. 圈什么 ...
- 圈复杂度Cyclomatic complexity
一.什么是圈复杂度 圈复杂度(Cyclomatic complexity,简写 CC)也称为条件复杂度,是模块结构复杂度的度量,数量上表现为独立路径的条数,即合理的预防错误所需测试的最少路径条数. 成 ...
最新文章
- “造车时代”多方笃定小米造车,网络营销外包专员如何看待这一波营销?
- 安装gcc 4.8.2 for cxx 11
- PHP——MySQL数据库分页查询
- u-boot移植第五弹——2013.10u-boot通过tftp下载到内存中运行
- DataSet.Relations 属性
- word流程图两条线的端点连接_GitMind免费的思维导图+流程图制作工具
- 辨异 —— Java 中的抽象类和接口
- java代码post接口请求 用 hutool工具类
- 4月1日标准IO和文件IO的区别(个人收藏)
- OSChina 周三乱弹 —— 在 OSC 谁能横行霸道?
- linux cpu数理,Linux中的 德·摩根定律
- 《操作系统》总结四(文件管理)
- 编码、字符集编码、UTF8mb3/UTF8mb4
- 一代宗师陨落!84岁华人计算机视觉泰斗Thomas S. Huang 仙逝,李飞飞等沉痛悼念黄煦涛教授...
- matlab imagesc
- Google一日体验
- Shader视差贴图
- 概率论-大数定律与中心极限定理思维导图
- 计算机网络教学优秀教案,计算机网络教学教案.docx
- 进程与MMU、TLB之间的疑问