Sonar圈复杂度介绍及高圈复杂度代码的优化思路

时间:2024-03-18 19:36:33

一、sonar是什么:

sonar是一个代码质量管理平台,能检测出项目中存在的以下一些常见问题。

1.缺乏单元测试。统计并展示单元测试覆盖率。

2.重复代码。检测项目中存在的重复代码,并可以在线查看哪些代码重复。

3.注释不足或过多。没有注释将使代码可读性变差,而过多的注释又会使得开发人员花费过多的精力去阅读注释,违背初衷。

4.潜在的缺陷。比如程序有可能存在空指针,数组越界等问题。

5.不遵循代码标准。如方法,类的命名不规范。

6.糟糕的复杂分布。文件,类,方法等,如果复杂度过高将难以维护,这将会使其它开发人员难以理解它们,且如果没有自动化的单元测试,对于程序中的任何小的修改都将可能导致需要全量回归测试。

二、sonar的圈复杂度是如何计算的:

圈复杂度是一种代码复杂度的衡量标准。它是一种固定的数据模型计算方式。它可以用来衡量一个模块判定结构的复杂程序,数量上表现为独立线性路径条数,也可理解为覆盖所有的可能情况最少使用的测试用例数。圈复杂度高说明程序代码的判断逻辑复杂,可能质量低且难以测试和维护。

下面是圈复杂度计算规则:

1. &&、|| 条件判断符号+1

2. if,else if,else,switch分支语句+1

3. for、while、do while 循环语句+1

4. catch 捕获异常语句+1

5. break、continue 终端语句+1

6. 如果if、for、while、do while、catch存在嵌套时,里层的语句相对于外层+1

7. sonar要求认知复杂度不能高于15

下面看一个例子:

Sonar圈复杂度介绍及高圈复杂度代码的优化思路

 上面的两个方法虽然代码复杂度相同,但是再可读性上却有很大差别,开始圈复杂度的数学模型赋予这两种方法同等的权重,但是从视觉上看,sunOfPrimes比getWords的代码更难理解,因此圈复杂度放弃使用数学模型来平评估,而是使用一套简单的规则将直观感受转化为数字。

三、圈复杂度代码优化思路:

1. 针对if,else判断的处理,如果之后没有处理,则在if中直接返回,else无需使用  --优化表达式

2.代码中多层嵌套循环,逻辑重组,将多层循环抽取(明确执行该处代码具体需要满足的条件) --提炼函数

3.减少if,else,for,while,do while,catch关键字嵌套,可以把深层次的代码抽象成方法  --简化代码

4.如果大量使用if-else语句可以考虑用switch代替  --减少认知复杂度

5.判空等操作可以使用工具类,减少||,&&的判断使用 。如StringUtils.isBlank(str)可替换str==null&&str=="" --工具类替换逻辑判断

有关圈复杂度的内容就先说这么多~

 

喜欢的朋友欢迎点赞,评论,关注哦~~