什么是圈复杂度?如何优化圈复杂度?
😀大家好!我是向阳🌞,一个想成为优秀全栈开发工程师的有志青年!
📔今天想跟大家探讨一下圈复杂度这个概念以及如何降低圈复杂度。
1. 什么是圈复杂度?
首先我们先了解一下什么是圈复杂度。
圈复杂度(Cyclomatic Complexity, CC) 是一种用于评估代码复杂性的软件度量方法,圈复杂度也称为条件复杂度。一般情况下,代码的分支 / 判断越多,圈复杂度越高。一般情况下,代码圈复杂度建议<=10,不建议超过20!
圈复杂度也可理解为覆盖所有的可能情况最少使用的测试用例个数。
下面这个表格可以看出圈复杂度对于代码的可测性和维护成本来说有多重要。
圈复杂度 | 代码状况 | 可测性 | 维护成本 |
---|---|---|---|
1~10 | 清晰 | 高 | 低 |
10~20 | 复杂 | 中 | 中 |
20~30 | 非常复杂 | 低 | 高 |
>30 | 不可读 | 不可测 | 非常高 |
1.1.圈复杂度的常用指标
- COGC(Cyclomatic Complexity):圈复杂度,是一种通过计算图中的节点、边和连接组件的数量来度量程序复杂性的指标。
- VG(节点个数):表示图中节点的数量。
- EDGES(边的数量):表示图中边的数量。
- EVG(Essential VG):表示程序中的基本节点数。
- IVG(Inessential VG):表示程序中的非基本节点数。
在某平台一知名UP主说他们以前在企鹅打工的时候,要求代码的圈复杂度最差不能超过15,否则代码就会被打回优化,由此可见,保证代码的圈复杂度对我们来说还是很重要滴。
现在我们了解了什么是圈复杂度,以及什么在影响着圈复杂度的大小,接下来我们来学习两个东西。
- 如何查看代码的圈复杂度大小(这里以IDEA为例学习如何查看)
- 如何降低圈复杂度
2. 查看圈复杂度大小
本篇文章不是教学如何手动计算代码的圈复杂度,而是站在巨人的肩膀上,使用插件来进行完成。
2.1.MetricsReloaded
- 首先我们打开IDEA,选择 File -> Setting
- 打开Setting后,选择Plugin,输入MetricsReloaded进行下载Install,这里博主已经下载好了。
- 以上操作进行完毕后,我们就可以对代码进行圈复杂度测试了。
2.2.使用方法
- 我们对要检测的类进行鼠标右键点击,选择下面图片进行操作。
- 点击后,默认选项就好不用进行其他操作,点击Analyze。
- 点击后就自动弹出这个类的圈复杂度啦。
可以看出,我们这个类的圈复杂度达到了恐怖的70!根据我们前面介绍的圈复杂度,我们可以知道是因为这个类中的分支 / 判断的语句太多了。
3. 降低圈复杂度
圈复杂度这么大,我们应该想办法去解决,那就是尽可能的减少覆盖所有的可能情况最少使用的测试用例个数,也就是提前结束执行。
接下来我将介绍几种方法来减少圈复杂度。
3.1.抽取方法
我们可以将一段功能代码抽取为一个方法。使用IDEA的快捷键 Ctrl + Alt + M。
或者可以选中要抽取的代码块,鼠标右击,按照下图进行操作。
3.2.卫语句
3.2.1.什么是卫语句
卫语句是一种编程技巧,用于将复杂的条件表达式拆分成多个条件,减少嵌套。
3.2.2.使用卫语句
对准要优化的判断语句,按住 Alt + Enter ,选择 Invert if 进行转换。
3.3.使用工具类
我们可以使用一些工具类来减少判断语句,例如使用 hutool 工具包中的 StrUtil 工具类中的blankToDefault() 方法。
String type = modelInfo.getType();
if (StrUtil.isBlank(type)) {
type = "String";
modelInfo.setType(type);
}
下面这段代码可以完全平替上面这段代码。
modelInfo.setType(StrUtil.blankToDefault(modelInfo.getType(), "String"));
4. 操作后的代码圈复杂度
经过上述一系列操作后,接下来就是见证奇迹的时刻了,让我们看看圈复杂度变成了多少。
看!这个类的圈复杂度缩小到了惊人的6.25!!!这段代码逆袭为一段优秀的代码了。
🌻以上就是全部有关圈复杂度的内容啦,感谢大家阅读 !🌻
——👦[作者]:向阳256
——⏳[更新]:2024.09.16
——🥰本人技术有限,如果有不对指正需要更改或者有更好的方法,欢迎到评论区留言。