Cyclomatic Complexity

1. 概念

a. 圈复杂度是一种衡量代码复杂程度的标准。

b. 圈复杂度高的害处:

圈复杂度大说明代码的判断逻辑复杂,可能质量低;

需要的更多的测试用例,难于测试和维护;

程序的可能错误和高的圈复杂度有着很大关系。

c. 圈复杂度的表现:

代码中分支循环语句多(if/else, switch/case, for, while),圈复杂度与分支循环语句个数正相关;

表达式复杂(含有三元运算符 )。

2. 圈复杂度的计算方法

(1)圈复杂度可以通过程序控制流图计算,公式为:V(G) = e + 2 - n

e : 控制流图中边的数量

n : 控制流图中节点的数量(包括起点和终点;所有终点只计算一次,多个return和throw算作一个节点)

(2)圈复杂度对应程序控制流图中从起点到所有终点的路径的条数,所以页可以通过数路径的方式获得圈复杂度。

3. 圈复杂度计算实例

private int CalculateScore(int culture, String nation, booleanextend) {int result = 0;if (culture < 0) {throw new RuntimeException("分数不能小于0");

}else if (culture < 200) {returnculture;

}else{switch(nation){case "汉":

result= 0;break;case "蒙":case "回":case "维":case "藏":

result= 10;break;default:

result= 20;

}

}if(extend) {

result+= 10;

}return result +culture;

}

程序控制流图:

(1)   V(G) = 21 + 2 - 13 = 8;

(2)   数路径:8条

4. 减小圈复杂度的方法

a. 提取函数 - 将独立业务或模块代码独立出来,封装为函数,通过函数名诠释代码作用,做到见名知意。

b. 替换算法 - 复杂算法会导致bug可能性的增加及可理解性/可维护性的降低,如果函数对性能要求不高,提倡使用简单明了的算法。

c. 分解条件式 - 复杂的条件表达式,使用函数进行封装

d. 合并条件式 - 将一系列得到相同结果的条件表达式合并,可以的话封装为函数

e. 合并重复的条件片段 - 不同条件的分支,有相同的处理,可以提炼出分支以外,或者封装为函数

f. 移除控制标记 - 使用控制标签作为条件的,使用break 和 return取代

g. 将查询函数和修改函数分离 - 单一职责原则,强调函数的复用性而不是多用性

h. 函数携带参数 - 使用带参函数,强调函数的复用性

i. 以明确函数取代参数 - 强调函数的功能的明确性

圈复杂度函数Java_圈复杂度 - byron_nj - 博客园相关推荐

  1. linux编写一个博客脚本,Linux 脚本编写基础 - 凌度 - 博客园.pdf

    Linux 脚本编写基础 - 凌度 - 博客园 Linux 脚本编写基础 1. Linux 脚本编写基础 1.1 语法基本介绍 1.1.1 开头 程序必须以下面的行开始 (必须放在文件的第一行): # ...

  2. dlibdotnet 人脸相似度源代码_使用dlib中的深度残差网络(ResNet)实现实时人脸识别 - supersayajin - 博客园...

    opencv中提供的基于haar特征级联进行人脸检测的方法效果非常不好,本文使用dlib中提供的人脸检测方法(使用HOG特征或卷积神经网方法),并使用提供的深度残差网络(ResNet)实现实时人脸识别 ...

  3. 圈复杂度函数Java_java 圈复杂度

    圈复杂度过大影响了程序的运行效率,应该保证每个方法的全复杂度空值在小于5的范围. 本例子纯属为了测试每个函数的全复杂度为多大. public class MaxComplexity { public ...

  4. 后端渲染 java_前后端渲染 - 空一座旧城,守一个旧人 - 博客园

    前后端渲染之争 1.引言 十年前,几乎所有网站都使用 ASP.Java.PHP 这类做后端渲染,但后来随着 jQuery.Angular.React.Vue 等 JS 框架的崛起,开始转向了前端渲染. ...

  5. main,tmain,winmain()等函数——UNICODE - sensensen - 博客园

    最近使用Visual Studio 2008 发现 入口函数为_tmain,google一下,得解: 1.main是C程序的函数,_tmain是main为了支持unicode所使用的main的別名 2 ...

  6. python从入门到实践答案博客园_《Python从入门到实践》--第八章 函数 课后练习4...

    题目: 8-12 三明治 :编写一个函数,它接受顾客要在三明治中添加的一系列食材.这个函数只有一个形参(它收集函数调用中提供的所有食材),并打印一条消息,对顾客 点的三明治进行概述.调用这个函数三次, ...

  7. mysql 内联函数_内联函数 - freeboy小亮 - 博客园

    (1)什么是内联函数? 内联函数是指那些定义在类体内的成员函数,即该函数的函数体放在类体内. (2)为什么要引入内联函数? 当然,引入内联函数的主要目的是:解决程序中函数调用的效率问题.另外,前面我们 ...

  8. 路径之谜 java_路径之谜 - 给杰瑞一块奶酪~ - 博客园

    小明冒充X星球的骑士,进入了一个奇怪的城堡. 城堡里边什么都没有,只有方形石头铺成的地面. 假设城堡地面是 n x n 个方格.[如图1.png]所示. 按习俗,骑士要从西北角走到东南角. 可以横向或 ...

  9. java xpath 函数,XPath常用定位节点元素语句总结 - 中国龍 - 博客园

    将一个XML或HTML文档转换成了DOM树结构后,如何才能定位到特定的节点?XPath实现了这样的功能,它通过DOM树中节点的路径和属性来导航,通过XPath路径表达式可以选择DOM树中的nodes( ...

最新文章

  1. Oracle 11g sys,system 密码忘记设置解决办法
  2. 算法------长度最小的子数组
  3. 武林外传辅助工具详细制作过程[第二篇:查看数据]
  4. 滴滴出行首次进军非洲市场,网络推广外包后的滴滴想去的国家还有很多
  5. linux python代码编辑器,Linux上的Python编辑器
  6. loam_livox
  7. 【小题目】输入一个数字表示重量,如果重量<=20,则每千克收费0.35元;如果超过20千克不超过100千克的范围,则超过的部分按照每千克0.5元收费;如果超过100千克,则超过的范围按照每千克0.8元
  8. STM32F1如何切换到不同的型号
  9. ASP.NET Core Web Api之JWT(一)
  10. Go语言之进阶篇响应报文测试方法
  11. logging日志模块
  12. scala中getorElse()方法
  13. ASP.Net的HtmlHelper和UrlHelper
  14. SPSS 独立样本t检验方法
  15. DSP28m35的IPC通讯编程经验
  16. 直接添加GO词云到基因表达热图上
  17. jqGrid简单使用、json格式和jsonReader介绍
  18. 【天眼数聚】微信小程序 活体识别提示“照片质量低”
  19. python爬取四川建设行业数据共享平台
  20. Echarts中series、option、component究竟是啥?

热门文章

  1. QT 实现Label上画线
  2. 8-2 sdust-Java-文件读取与统计【人工判编程题】 (30 分)
  3. quartz mysql 表 集群配置_Spring整合实战丨Quartz 集群配置
  4. 直播预告| ICML专场四~
  5. Git、GitLab这辈子的错都报完了 You have not concludedUnlink of file、 Pulling is not possible、Your local changes
  6. 基于SpringBoot的城市建设用地管理系统的设计与实现
  7. PS基础--水平翻转图像
  8. python派森编程_派森(Python)官方下载_派森(Python)最新版_派森(Python)v2.7.14官方正式版-华军软件园...
  9. 2019-07-12 函数递归、二分法、匿名函数、三元表达式、内置函数
  10. 读书笔记:《图说区块链》