一. 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。如:
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.
问题:不应在接口中定义常量。
解决:我把只有一个实现类的接口中的常量转移到实现类中。另外定义了一个全局的类(com.guazi.finance.rulengine.data.constant.RuleEngineConstant)用于存储具多个实现类的接口中的常量。
2.
问题:Class.forName()动态类加载,如:
解决:用下面的方法代替
Class.class.getDeclaredMethod("forName", String.class).invoke(null, className);
3.
问题:非静态方法修改静态变量,如:
解决:增加一个static方法,在原方法中调用,如:
Public class MyClass {
private static int count = 0;
private static incrCount() {
count++;
}
public void doSomething() {
incrCount();
}
}
4.
问题:变量/方法名称不符合命名规范。
解决:修改变量/方法名称符合驼峰式命名规范,并把用到此变量或方法的地方一并修改(IDEA中点击所要修改的代码,右键->Find Usages找到用到此代码的所有位置)
5.
问题:常量名称不符合规范
解决:修改常量名称全大写并以下划线分隔,并把用到此常量的地方一并修改。(注:最多出现按名称注入时的常量Qualifier,要改为大写public static final String QUALIFIER = "...")
6.
问题:使用equals方法时。有常量时常量作为方法调用方,可以防止空指针异常。
解决:调换参数位置。
7.
问题:每个switch要添加一个default 语句。
解决:添加default语句,可以在其中添加日志语句来排查错误。
8.
问题:switch中每个case要有break/return语句。
解决:添加break/return语句。