什么是Cyclomatic Complexity循环复杂度

news2024/11/25 0:39:46

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条可能的执行路径。

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何使得HAL库STM32代码可以复制,重复使用

在上面这个代码使用标准库写的,但是这个方法可以放在HAL库代码里面没有问题, 如果所有引脚的初始化都是用CubeMX生成,那么只要引脚有变化,Hal库代码就每次都要使用CubeMX生成,而且因为引脚不确定导致要移植的代码不一…

计算机基础知识59

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

[python]离线加载fetch_20newsgroups数据集

首先手动下载这个数据包 http://qwone.com/~jason/20Newsgroups/20news-bydate.tar.gz 下载这个文件后和脚本放一起就行,然后 打开twenty_newsgroups.py文件(在fetch_20newsgroups函数名上,右键转到定义即可找到) 之后运行代码即…

SpringBoot监控Redis事件通知

Redis的事件通知 Redis事件通过 Redis 的订阅与发布功能(pub/sub)来进行分发, 因此所有支持订阅与发布功能的客户端都可以在无须做任何修改的情况下, 使用键空间通知功能。 因为 Redis 目前的订阅与发布功能采取的是发送即忘&am…

MySQL进阶-锁

✨作者:猫十二懿 ❤️‍🔥账号:CSDN 、掘金 、语雀 、Github 🎉公众号:猫十二懿 一、MySQL 锁 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、…

Excel如何比较两列数据的不同

当遇到exel有两个列表的数据,需要比较得到他们的不同的部分,并且得到一个不同的值的列表。示例如下: 目的是:通过比较,知道Column2的哪些值不在在Column1里。 WPS直接提供了这一个功能,如下图:…

基于Python获取亚马逊的评论信息的处理

文章目录 一、分析亚马逊的评论请求二、获取亚马逊评论的内容三、亚马逊评论信息的处理四、代码整合4.1 代理设置4.2 while循环翻页 总结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具…

理解Android无埋点技术

首先什么是无埋点呢,其实所谓无埋点就是开发者无需再对追踪点进行埋码,而是脱离代码,只需面对应用界面圈圈点点即可追加随时生效的事件数据点。 无埋点的好处 其实无埋点并不是完全不用写代码,而是尽可能的少写代码。开发者将SDK集…

策略算法与Actor-Critic网络

策略算法 教程链接 DataWhale强化学习课程JoyRL https://johnjim0816.com/joyrl-book/#/ch7/main 策略梯度 与前面的基于价值的算法不同,这类算法直接对策略本身进行近似优化。 在这种情况下,我们可以将策略描述成一个带有参数 θ θ θ的连续函数…

案例032:基于微信小程序的电子商城购物平台的设计与开发

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

软件测试回归测试流程

回归测试作为软件生命周期的一个组成部分,在整个软件测试过程中占有很大的工作量比重,软件开发的各个阶段都会进行多次回归测试。在渐进和快速迭代开发中,新版本的连续发布使回归测试进行的更加频繁,而在极端编程方法中&#xff0…

堆的应用:堆排序

文章目录 前言堆排序的实现(升序为例)代码 前言 堆排序,顾名思义是一个利用堆来完成排序的一个操作。在之前,小编在[C语言学习系列–>【关于qsort函数的详解以及它的模拟实现】] 谈到冒泡排序,但是冒泡排序…

CAM-Classification activation map 类激活图玩耍指南

原始论文 Learning Deep Features for Discriminative Localization 衍生论文 代码实现 torch-cam 该项目把代码打包成为了一个库,我们可以直接调用; torchcam.methods 这是上面那个项目的文档说明;

FreeRTOS任务创建及细节

目录 任务创建 简化的TCB结构体 创建任务堆栈和任务TCB 初始化任务TCB的成员 初始化任务堆栈 把新任务添加到就绪列表 任务创建 BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,const char * const pcName, /*lint !e971 Unqualified char types are allowed for …

Harmony入门-HelloWorld

HarmonyOS 已经出来一些时间了。也有了OpenHarmony,作为HarmonyOS抽离的基础架构OpenHarmony,贡献给开源了,后续独立出来,那可真是就要独立生态啦,咱们顺水行舟,学习学习。 1.IDE 安装 https://hmxt.org/d…

Aapche Dubbo 不安全的 Java 反序列化 (CVE-2019-17564)

漏洞描述 Apache Dubbo 是一个高性能的、基于 Java 的开源 RPC 框架。 Apache Dubbo 支持不同的协议,它的 HTTP 协议处理程序是 Spring Framework 的 .org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter Spring Framework 的安全警告显示&am…

VS2022 配置Qt编译环境 | winows安装Qt5.14.2 | VS2017和Qt5配置成功指南

Visual Studio 2022安装教程完文本内容较多,请耐心看完,挺有收获的,要自己多尝试哦。 文章目录 # 插件安装 如果你想用VS2022来创建QT项目,那么你首先要学会下面的操作,创建一个空白解决方案,在扩展搜索qt,并且下载两个插件(带有绿√的就是)。这里其实是一个坑:VS20…

福利来了| 200多款精选简历模板免费领,让你30秒内征服HR!

找工作是不是让你很头大?尤其是写简历,真的好痛苦啊!我在网上找了好久,都没有找到合适的简历模板,自己做又不知道从哪里下手。 不过现在好了,有一个超级福利送给大家!200多款精选简历模板免费领…

231127 刷题日报

这周值班。。多少写道题吧,保持每天的手感。老婆给买了lubuladong纸质书,加油卷。 1. 131. 分割回文串 写个这个吧,钉在耻辱柱上的题。 为啥没写出来: 1. 递归树没画对 把树枝只看做是1个字母,而且不清楚树枝和节点…

键盘打字盲打练习系列之刻意练习——1

一.欢迎来到我的酒馆 盲打,刻意练习! 目录 一.欢迎来到我的酒馆二.选择一款工具三.刻意练习 二.选择一款工具 俗话说:工欲善其事必先利其器。在开始之前,我们可以选择一款练习盲打的工具。打字软件有很多,还有专门练习打字的网站&…