什么是Cyclomatic Complexity循环复杂度

Cyclomatic Complexity,可以翻译成

  • 循环复杂度
  • 圈复杂度
  • 圈复杂性
  • 回路复杂性

循环复杂度是软件工程中的一个定量度量,表示程序或函数的复杂性。它衡量程序源代码中线性独立路径或分支的数量。如果一个函数的循环复杂度太高了,就需要进行重构。

在本文中会介绍循环复杂度的计算。很多人都认为代码的质量是见仁见智,非常主观的。因为软件这东西起源于欧美,那里的文化就是什么都要量化一下,绝对化一下。所以他们总想着摆脱这种主观性,企图找到一种客观的量化工具,那么循环复杂度就是他们找到的一种。不能说这东西完全有效,有些理念还是挺好的。

高循环复杂度的方法或函数,意味着不容易阅读和维护,最好对其进行重构。如果循环复杂度为1的函数,那么它每一次执行都是走同一条路径的。相反,如果函数的复杂度达到了5,意味着它可能有5条可能的执行路径。

循环复杂度的计算公式: E - N + 2P

  • E:图的边的数量
  • N:图的节点数量
  • P:连通分支的数量

首先,将代码转化成图(Graph) ,每个节点(Node)就是代码的一条语句,连接节点的就是边(Edge),**连通分支(P)**简单点来说就是函数的退出点。

通过举例来说明循环复杂度的计算:

循环复杂度为1的例子

函数1:

fun  getResponse(int grade): String {
	val response = "Your grade is $grade"
	return response
}

转化成图:
请添加图片描述
从上面这个,我们可知,边一条,节点两个,退出点一个,所以1-2+2*1 = 1.

循环复杂度为2的例子

函数2:

fun  getResponse(int grade): String {
	var response = "Your grade is $grade"
	if(grade > 3) {
		response += " Well Done!"
	}
	return response
}

图:
在这里插入图片描述
从上面这个,我们可知,边4条,节点4个,退出点1个,所以4-4+2*1 = 2,就是说有两条可能的执行路径。

循环复杂度为3的例子

函数3:

fun  getResponse(int grade,int score): String {
	var response = "Your grade is $grade"
	if(grade > 3) {
		response += " Well Done!"
	}
	if(score > 90) {
		response += " very very good!"
	}
	return response
}

图:
请添加图片描述
从上面这个,我们可知,边7条,节点6个,退出点1个,所以7-6+2*1 = 3,就是说有3条可能的执行路径。大家可能觉得这里应该是4条可能的执行路径,那么大家可以这么来理解,每一个if都会在原来的路径上开出一条潜在的路。从面这个函数可知函数在1节点开始,这是主路,到了第一个if节点添加了一条潜在的分支,第二个if节点又添加了另一条潜在的分支,加起来就是3.

稍微复杂一些的循环复杂度为3的例子

函数4:

public int  getResponse(int a, int b, int c) {
	if(a == 10){
		if(a > c) {
			a = b;
		} else {
			a = c;
		}
	}
	return a
}

图:
在这里插入图片描述
从上面这个,我们可知,边6条,节点5个,退出点1个,所以6-5+2*1 = 3,就是说有3条可能的执行路径。

其他的情况依次类推。如果循环复杂度的计算有难度的话,那就是准确地画出函数的执行图。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/194233.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

sqli-labs靶场详解less-24(二次注入)

less-24 对于一个像我一样的小白来说这关就像php代码审计 一开始进行判断注入点的时候怎么都找不到一点思路都没有 只能搜教程 说是二次注入 从来没遇见的题型 于是从代码审计开始 先说一下什么叫二次注入 二次注入 二次注入是指通过SQL语句存储到数据库的用户输入被读取后再次…

STM32_9(USART串口)

一、串口通信 串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大地扩展了单片机的应用范围&#xff0…

西南科技大学(数据结构A)期末自测练习一

一、填空题(每空0.5分,共5分) 1、数据结构是指( A )。 A、数据元素的组织形式 B、数据类型 C、数据存储结构 D、数据定义 2、数据结构被形式地定义为(D,R),其中D是( B )的有限集合,R是D上( D )的有限集合。 (1)A.算法B.数据元素C.数据操作D.逻辑结构 (2)A.操作B.…

滴滴昨晚崩了,看这波还敢不敢降本增效?

起因 截至 2023 年 11 月 27 日晚,中国最大的网约车服务平台滴滴打车遭遇系统崩溃,继阿里云控制台故障之后,再次引发热议。这一事件迅速攀升至热搜榜首,引起广泛关注。 今晚约 10 点,滴滴打车遭遇大范围技术故障。用户…

小程序----使用图表显示数据--canvas

需求:在小程序上实现数据可视化 思路:本来想用的是echarts或者相关的可视化插件,但因为用的是vue3,大多数插件不支持,所以用了echarts,但最后打包的时候说包太大超过2M无法上传,百度了一下&…

[Linux] 正则表达式及grep和awk

一、正则表达式 1.1 什么是正则表达式 正则表达式是一种用于匹配和操作文本的强大工具,它是由一系列字符和特殊字符组成的模式,用于描述要匹配的文本模式。 正则表达式可以在文本中查找、替换、提取和验证特定的模式。 正则表达式和通配符的区别 正则…

继承JsonSerializer+注解实现自定义数据脱敏方案

1、数据脱敏 数据脱敏是一种保护隐私数据的技术,通过将敏感信息转化为非敏感信息来实现对数据的保护,以保护敏感隐私数据的可靠性和安全性。 数据脱敏可以分为可恢复和不可恢复两类: 可恢复类可以通过一定的方式恢复成原来的敏感数据。不可恢复类则无…

计算机基础知识59

MySQL的卸载流程 1、先停止MySQL服务:右键“此电脑”,选择“管理”,之后选择“服务和应用程序”--“服务”,在服务中找到“MySQL”,右键选择“停止”。 2、找到“控制面板”--“程序和功能”,找到MySQL&…

C++二分查找视频教程:两数之和

作者推荐 利用广度优先或模拟解决米诺骨牌 本文涉及的基础知识点 二分查找算法合集 题目 给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 n…

Find My键盘|苹果Find My技术与键盘结合,智能防丢,全球定位

键盘是最常用也是最主要的输入设备,通过键盘可以将英文字母、汉字、数字、标点符号等输入到计算机中,从而向计算机发出命令、输入数据等。还有一些带有各种快捷键的键盘。随着时间的推移,渐渐的市场上也出现独立的具有各种快捷功能的产品单独…

STK Components 二次开发- StarLink

1.星链数据下载 CelesTrak: Current GP Element Sets 下载二根数就可以。 2.处理数据 下载下来的数据是这样,要将字符串转为 二根数对象 TwoLineElementSet tle new TwoLineElementSet(tleString); Sgp4Propagator propagator new Sgp4Propagator(tle); 3.批量…

linux task_struct中进程调度相关的变量记录

参考文章: Linux进程调度分析记录,进程优先级,隔离处理器,isolcpus - 知乎

js的数组去重方法

目录 es6数组中对象去重 1. filter()用法 2. findIndex()用法 3. 去重 其他方法: 方法二:reduce()去重 1. reduce()用法 1.1 找出字符长度最长的数组成员。 1.2 扁平化二维数组 1.3 扁平化多维数组 三、总结方案: 使用Set&#xf…

AT89S52单片机------中断系统

目录 单片机的内部结构 中断请求标志寄存器 (1)TCON寄存器 (2)SCON寄存器 (3)定时器2的控制寄存器T2CON 中断允许与中断优先级的控制寄存器 中断允许寄存器IE 中断优先级寄存器IP 响应中断请求的条件 外部中断响应时间 外部中断的触发方式选择 中断请求的撤销 1.定…

[极客大挑战2023] Crypto/PWN/Reverse

这个网站真辛苦,每次都要回到all,屏幕随时卡。界面有待进步老远。也不提示结束,结果现在才听说结束了,才开始记录一下。 还跟往常一样,WM不作,其它也AK不了,总是差点。 Crypto SignIn 53594…

AI - Steering behaviors(转向系统)

游戏AI角色的转向系统(Steering behaviors)实现 一些向量的接口是cocos2dx的。但从名字上应该能理解做了什么向量操作 Seek: 获取当前位置指向目标点的向量,转化为单位向量后再乘以速度值,即为所需速度desired velo…

Centos 如何判断分区是mbr还是gpt格式

1 介绍 MBR 自20世纪80年代初以来的标准分区表格式每个驱动器最多支持四个主分区最多可以划分2TB的磁盘 GPT GPT是MBR分区表格式的后续每个驱动器最多支持128个分区可以将一个磁盘分区到最大到18艾字节 对小于2TB的磁盘使用MBR对大于2TB的磁盘使用GTP 2 查询方式 2.1 fdis…

uniapp页面使用多个echarts出现数据渲染错乱问题解决

首先,uniapp当中使用echarts是在通过使用renderjs的script模板的前提下实现的,在官方提供的案例当中,核心代码是这一部分: 但如果将其封装为组件,并在一个页面当中引用多次来生成多个charts图标,那么这个时…

化学仿制药参比制剂目录-参比制剂查询网站

2015年以前,参比制剂对于仿制药的研究无关紧要,但推出了’仿制药一致性评价’后,参比制剂的选择成为了决定仿制药成功与否的关键因素,如今在进行仿制药研究时,首要任务就是确定仿制目标,也就是参比制剂。 …

C++之算术生成算法

C之算术生成算法 accumulate #include<iostream> using namespace std; #include<vector> #include<numeric>void test() {vector<int> v;for (int i 0; i < 10; i){v.push_back(i);}int total accumulate(v.begin(), v.end(),0);cout << t…