圈复杂度函数Java_圈复杂度 - byron_nj - 博客园
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 - 博客园相关推荐
- linux编写一个博客脚本,Linux 脚本编写基础 - 凌度 - 博客园.pdf
Linux 脚本编写基础 - 凌度 - 博客园 Linux 脚本编写基础 1. Linux 脚本编写基础 1.1 语法基本介绍 1.1.1 开头 程序必须以下面的行开始 (必须放在文件的第一行): # ...
- dlibdotnet 人脸相似度源代码_使用dlib中的深度残差网络(ResNet)实现实时人脸识别 - supersayajin - 博客园...
opencv中提供的基于haar特征级联进行人脸检测的方法效果非常不好,本文使用dlib中提供的人脸检测方法(使用HOG特征或卷积神经网方法),并使用提供的深度残差网络(ResNet)实现实时人脸识别 ...
- 圈复杂度函数Java_java 圈复杂度
圈复杂度过大影响了程序的运行效率,应该保证每个方法的全复杂度空值在小于5的范围. 本例子纯属为了测试每个函数的全复杂度为多大. public class MaxComplexity { public ...
- 后端渲染 java_前后端渲染 - 空一座旧城,守一个旧人 - 博客园
前后端渲染之争 1.引言 十年前,几乎所有网站都使用 ASP.Java.PHP 这类做后端渲染,但后来随着 jQuery.Angular.React.Vue 等 JS 框架的崛起,开始转向了前端渲染. ...
- main,tmain,winmain()等函数——UNICODE - sensensen - 博客园
最近使用Visual Studio 2008 发现 入口函数为_tmain,google一下,得解: 1.main是C程序的函数,_tmain是main为了支持unicode所使用的main的別名 2 ...
- python从入门到实践答案博客园_《Python从入门到实践》--第八章 函数 课后练习4...
题目: 8-12 三明治 :编写一个函数,它接受顾客要在三明治中添加的一系列食材.这个函数只有一个形参(它收集函数调用中提供的所有食材),并打印一条消息,对顾客 点的三明治进行概述.调用这个函数三次, ...
- mysql 内联函数_内联函数 - freeboy小亮 - 博客园
(1)什么是内联函数? 内联函数是指那些定义在类体内的成员函数,即该函数的函数体放在类体内. (2)为什么要引入内联函数? 当然,引入内联函数的主要目的是:解决程序中函数调用的效率问题.另外,前面我们 ...
- 路径之谜 java_路径之谜 - 给杰瑞一块奶酪~ - 博客园
小明冒充X星球的骑士,进入了一个奇怪的城堡. 城堡里边什么都没有,只有方形石头铺成的地面. 假设城堡地面是 n x n 个方格.[如图1.png]所示. 按习俗,骑士要从西北角走到东南角. 可以横向或 ...
- java xpath 函数,XPath常用定位节点元素语句总结 - 中国龍 - 博客园
将一个XML或HTML文档转换成了DOM树结构后,如何才能定位到特定的节点?XPath实现了这样的功能,它通过DOM树中节点的路径和属性来导航,通过XPath路径表达式可以选择DOM树中的nodes( ...
最新文章
- Oracle 11g sys,system 密码忘记设置解决办法
- 算法------长度最小的子数组
- 武林外传辅助工具详细制作过程[第二篇:查看数据]
- 滴滴出行首次进军非洲市场,网络推广外包后的滴滴想去的国家还有很多
- linux python代码编辑器,Linux上的Python编辑器
- loam_livox
- 【小题目】输入一个数字表示重量,如果重量<=20,则每千克收费0.35元;如果超过20千克不超过100千克的范围,则超过的部分按照每千克0.5元收费;如果超过100千克,则超过的范围按照每千克0.8元
- STM32F1如何切换到不同的型号
- ASP.NET Core Web Api之JWT(一)
- Go语言之进阶篇响应报文测试方法
- logging日志模块
- scala中getorElse()方法
- ASP.Net的HtmlHelper和UrlHelper
- SPSS 独立样本t检验方法
- DSP28m35的IPC通讯编程经验
- 直接添加GO词云到基因表达热图上
- jqGrid简单使用、json格式和jsonReader介绍
- 【天眼数聚】微信小程序 活体识别提示“照片质量低”
- python爬取四川建设行业数据共享平台
- Echarts中series、option、component究竟是啥?
热门文章
- QT 实现Label上画线
- 8-2 sdust-Java-文件读取与统计【人工判编程题】 (30 分)
- quartz mysql 表 集群配置_Spring整合实战丨Quartz 集群配置
- 直播预告| ICML专场四~
- Git、GitLab这辈子的错都报完了 You have not concludedUnlink of file、 Pulling is not possible、Your local changes
- 基于SpringBoot的城市建设用地管理系统的设计与实现
- PS基础--水平翻转图像
- python派森编程_派森(Python)官方下载_派森(Python)最新版_派森(Python)v2.7.14官方正式版-华军软件园...
- 2019-07-12 函数递归、二分法、匿名函数、三元表达式、内置函数
- 读书笔记:《图说区块链》