Cognitive Complexity
来自 SonarQube
认知复杂度旨在弥补传统的圈复杂度在衡量代码可维护性方面的不足:
- 对于不同结构的代码,即使圈复杂度相同,但是理解难度可能差异很大。
- 不适合现代的编程语言结构。
计算规则:
忽略简化写法
不计算那些使代码更简洁、已读的结构。
结构增量(Structural Increment)
for、while、do-while、if、?:、#if、#ifdef会增加 1 分。catch语句会增加 1 分。try和finally则不会加入统计。switch语句会增加 1 分。switch 里面的
case语句则不会加入统计。同类型的运算符会增加 1 分,但是不同类型的运算符会增加 n 分(n 取决于实际个数)。
if (a && b && c && d)会增加 1 分,if (a || b || c || d)会增加 1 分。if (a && b || c)会增加 2 分,if (a || (b && c) || d)会增加 3 分。递归调用会增加 1 分,每个参与递归的方法都会增加 1 分。
goto会增加 1 分。带标签的
break、continue会增加 1 分。(不带标签的break、continue则不加入统计)在 Java 中,支持 break xxx、continue xxx 的写法,等同于 C 里面的 goto xxx。
早期返回
return则不会加入统计。
混合增量(Hybrid Increment)
else、else-if都会增加 1 分。它们会增加嵌套层数,但不额外计算嵌套增量。嵌套增量(Nesting Increment)
嵌套增量等于当前的嵌套层级
嵌套层数则是在每个嵌套结构的基础分上加上当前的嵌套层数。
| |
错误提示
- The Cognitive Complexity of this function is 57 which is greater than 32 authorized.
- The Cognitive Complexity of this function is 66 which is greater than 32 authorized.
分析

其中:
+1: if statement
表示识别到
if语句,复杂度加 1。+3: if statement (incl 2 for nesting)
表示识别到
if语句,而且嵌套层级是 2,复杂度加 3。+1: else statement
表示识别的
else语句,复杂度加 1。+1: goto statement
表示识别到
goto语句,复杂度加 1。+1: iteration statement
表示识别到
do-while或while或for (;;)语句,复杂度加 1。+1: conditional operator
表示识别到
? :语句,复杂度加 1。+2: conditional operator (incl 1 for nesting)
表示识别到
? :语句,而且嵌套层级是 1,复杂度加 2。+1: logical operator
表示识别到
||或&&,复杂度加 1。+1: switch statement
表示识别到
switch语句,复杂度加 1。+4: switch statement (incl 3 for nesting)
表示识别到
switch语句,而且嵌套层级是 3,复杂度加 4。
版权声明
本文为「Zeepunt 日常随笔」的原创文章,遵循 CC BY-NC-ND 4.0 许可协议。允许在署名作者、注明原文链接且不作任何更改的前提下非商业性地分享本文。