首先,我们要知道,圈复杂度是什么?

圈复杂度(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阶段就会被打回重构。

三,降低圈复杂度的方法

常用的方法有:

  • 简化、合并条件表达式
  • 将条件判定提炼出独立函数
  • 将大函数拆成小函数
  • 以明确函数取代参数
  • 替换算法

质量管理之代码的圈复杂度相关推荐

  1. java代码质量 圈复杂度,代码圈复杂度(Cyclomatic Complexity,CC)和Oclint工具 介绍...

    什么是代码圈复杂度 圈复杂度是一种度量程序复杂度的方法,由 Thomas McCabe 于 1976年定义,用来衡量一个模块判定结构的复杂程度,数量上表现为独立路径条数,即合理的预防错误所需测试的最少 ...

  2. 前端代码质量-圈复杂度原理和实践

    写程序时时刻记着,这个将来要维护你写的程序的人是一个有严重暴力倾向,并且知道你住在哪里的精神变态者. 1. 导读 你们是否也有过下面的想法? 重构一个项目还不如新开发一个项目... 这代码是谁写的,我 ...

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

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

  4. 追求代码质量: 监视圈复杂度

    http://www.ibm.com/developerworks/cn/java/j-cq03316/ 每位开发人员对代码质量的含义都有着自己的看法,并且大多数人对如何查找编写欠佳的代码也有自己的想 ...

  5. 代码质量度量标准_追求代码质量(2): 监视圈复杂度

    每位开发人员对代码质量的含义都有着自己的看法,并且大多数人对如何查找编写欠佳的代码也有自己的想法.甚至术语代码味道(code smell) 也已进入大众词汇表,成为描述代码需要改进的一种方式. 代码味 ...

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

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

  7. 利用Java反射机制降低代码圈复杂度

    利用Java反射机制降低代码圈复杂度 在实际的工作中,我遇到了项目里老代码存在圈复杂度过高的问题,在提交代码的时候通不过CI(代码检查)的Lizard复杂度检查,所以迫切需要解决这个问题,运用Java ...

  8. java 圈复杂度_追求代码质量: 监视圈复杂度

    每位开发人员对代码质量的含义都有着自己的看法,并且大多数人对如何查找编写欠佳的代码也有自己的想法.甚至术语代码味道(code smell) 也已进入大众词汇表,成为描述代码需要改进的一种方式. 圈什么 ...

  9. 圈复杂度Cyclomatic complexity

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

最新文章

  1. “造车时代”多方笃定小米造车,网络营销外包专员如何看待这一波营销?
  2. 安装gcc 4.8.2 for cxx 11
  3. PHP——MySQL数据库分页查询
  4. u-boot移植第五弹——2013.10u-boot通过tftp下载到内存中运行
  5. DataSet.Relations 属性
  6. word流程图两条线的端点连接_GitMind免费的思维导图+流程图制作工具
  7. 辨异 —— Java 中的抽象类和接口
  8. java代码post接口请求 用 hutool工具类
  9. 4月1日标准IO和文件IO的区别(个人收藏)
  10. OSChina 周三乱弹 —— 在 OSC 谁能横行霸道?
  11. linux cpu数理,Linux中的 德·摩根定律
  12. 《操作系统》总结四(文件管理)
  13. 编码、字符集编码、UTF8mb3/UTF8mb4
  14. 一代宗师陨落!84岁华人计算机视觉泰斗Thomas S. Huang 仙逝,李飞飞等沉痛悼念黄煦涛教授...
  15. matlab imagesc
  16. Google一日体验
  17. Shader视差贴图
  18. 概率论-大数定律与中心极限定理思维导图
  19. 计算机网络教学优秀教案,计算机网络教学教案.docx
  20. 进程与MMU、TLB之间的疑问

热门文章

  1. 计算机考研基础必考知识点,2020考研计算机数学49个基础知识点
  2. G1垃圾回收器学习笔记
  3. 关于unity3d插件——easy touch
  4. 慕课哈工大C语言程序设计精髓-课后练习
  5. Delphi与Windows 7下的用户账户控制(UAC)机制(加小盾牌),注册表没反应
  6. type-challenges [medium]
  7. 云安全技术——Snort安装与配置
  8. 汉语树库/CoNLL格式,依存句法分析语料
  9. java跳出循环的几种方式
  10. 专 业 学 习 成 果