一. Cognitive Complexity(认知复杂度) 

Cognitive Complexity(认知复杂度) 

1.含义:

    认知复杂度是衡量一个方法的控制流程有多困难去理解。具有高认知复杂度的方法将难以维护。sonar要求复杂度要在15以下

 

2.Cognitve Complexity的计算:

    (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。如:

        Cognitive Complexity(认知复杂度)    

   

 3.修改思路:

    1.减少if、for、while、do while、catch关键字嵌套,可以把深层次的代码抽象成方法。

    2.如果大量相似的if-else语句可以考虑用switch代替

    3.没啥规律就看见if、for等关键字提成方法

 

  4.文档地址

    https://www.sonarsource.com/resources/white-papers/cognitive-complexity.html    

    

二. 其他的提示

 

1.Cognitive Complexity(认知复杂度) Cognitive Complexity(认知复杂度) 

    问题:不应在接口中定义常量。

    解决:我把只有一个实现类的接口中的常量转移到实现类中。另外定义了一个全局的类(com.guazi.finance.rulengine.data.constant.RuleEngineConstant)用于存储具多个实现类的接口中的常量。

 

2.Cognitive Complexity(认知复杂度) 

    问题:Class.forName()动态类加载,如:

    Cognitive Complexity(认知复杂度) 

    解决:用下面的方法代替

    Class.class.getDeclaredMethod("forName", String.class).invoke(null, className);

 

3.Cognitive Complexity(认知复杂度) 

    问题:非静态方法修改静态变量,如:

    Cognitive Complexity(认知复杂度) 

    解决:增加一个static方法,在原方法中调用,如:

    Public class MyClass {

        private static int count = 0;

        private static incrCount() {

            count++;

        }

        public void doSomething() {

            incrCount();

        }

    }

4.Cognitive Complexity(认知复杂度) 

    问题:变量/方法名称不符合命名规范。

    解决:修改变量/方法名称符合驼峰式命名规范,并把用到此变量或方法的地方一并修改(IDEA中点击所要修改的代码,右键->Find Usages找到用到此代码的所有位置)

 

5.Cognitive Complexity(认知复杂度) Cognitive Complexity(认知复杂度)  

    问题:常量名称不符合规范

    解决:修改常量名称全大写并以下划线分隔,并把用到此常量的地方一并修改。(注:最多出现按名称注入时的常量Qualifier,要改为大写public static final String QUALIFIER = "...")

 

6.Cognitive Complexity(认知复杂度) Cognitive Complexity(认知复杂度) 

    问题:使用equals方法时。有常量时常量作为方法调用方,可以防止空指针异常。

    解决:调换参数位置。

 

7.Cognitive Complexity(认知复杂度) Cognitive Complexity(认知复杂度) 

    问题:每个switch要添加一个default 语句。

    解决:添加default语句,可以在其中添加日志语句来排查错误。

 

8.Cognitive Complexity(认知复杂度) Cognitive Complexity(认知复杂度) 

    问题:switch中每个case要有break/return语句。

    解决:添加break/return语句。

相关文章:

  • 2021-06-11
  • 2022-02-10
  • 2022-12-23
  • 2021-06-13
  • 2022-12-23
  • 2021-12-10
  • 2021-07-15
  • 2022-12-23
猜你喜欢
  • 2022-01-03
  • 2022-12-23
  • 2022-01-01
  • 2022-12-23
  • 2022-01-25
  • 2022-03-08
相关资源
相似解决方案