【问题标题】:Simplifying nested if else loops Cognitive complexity in Java简化嵌套 if else 循环 Java 中的认知复杂性
【发布时间】:2020-02-13 01:37:13
【问题描述】:

我有一个用于构建原生 sql 查询的方法。我有 4 个字符串生成器作为输入,并且基于不同的条件,我需要构建我的查询。

这里是代码

private void appendConditions(StringBuilder query, StringBuilder condition, StringBuilder condition2,
        StringBuilder condition3) {
    if (StringUtils.isNotEmpty(condition.toString())) {
        query.append(ApplicationConstants.AND+"(");
        query.append("( " + condition + " )");
        if (StringUtils.isNotEmpty(condition2.toString())) {
            query.append(ApplicationConstants.AND);
            query.append("( " + condition2 + " )");
            if (StringUtils.isNotEmpty(condition3.toString())) {
                query.append(ApplicationConstants.AND);
                query.append("( " + condition3 + " )");
            }

        } else {
            if (StringUtils.isNotEmpty(condition3.toString())) {
                query.append(ApplicationConstants.AND);
                query.append("( " + condition3 + " )");
            }
        }
        query.append(" )");
    } else {
        if (StringUtils.isNotEmpty(condition2.toString())) {
            query.append(ApplicationConstants.AND+"(");
            query.append("( " + condition2 + " )");
            if (StringUtils.isNotEmpty(condition3.toString())) {
                query.append(ApplicationConstants.AND);
                query.append("( " + condition3 + " )");
            }
            query.append(" )");
        } else {
            if (StringUtils.isNotEmpty(condition3.toString())) {
                query.append(ApplicationConstants.AND+"(");
                query.append("( " + condition3 + " )");
                query.append(" )");
            }
        }
    }
}

当我运行我的声纳报告时,它说这种方法的认知复杂性更高。 我可以简化这种方法以避免许多 if-else 循环

谢谢!

【问题讨论】:

  • Code Review 是一个比较合适的地方问。
  • 你能edit你的问题并发布一个对方法appendConditions()的示例调用吗?换句话说,为方法参数queryconditioncondition2condition3提供样本值?

标签: java if-statement sonarqube


【解决方案1】:

简化可以包括概括:具有可变参数的条件。 然后,Stream 解决方案只需几秒钟。

private void appendConditions(StringBuilder query, StringBuilder... conditions) {
    String ands = Stream.of(conditions)
            .map(StringBuilder::toString)
            .filter(StringUtils::isNotEmpty)
            .map(c -> "(" + c + ")")
            .collect(Collectors.joining(ApplicationConstants.AND));
    if (!ands.isEmpty()) {
        query.append(ApplicationConstants.AND).append(ands);
    }
}

如果需要,可以使用Stream.of(condition1, condition2, condition3)

【讨论】:

    【解决方案2】:
    if(StringUtils.isNotEmpty(condition.toString()) &&  StringUtils.isNotEmpty(condition.toString()) && StringUtils.isNotEmpty(condition.toString())) {
        // If all not empty
        query.append(ApplicationConstants.AND+"(");
        query.append("( ").append(condition).append(" )");
        query.append(ApplicationConstants.AND);
        query.append("( ").append(condition2).append(" )");
        query.append(ApplicationConstants.AND);
        query.append("( ").append(condition3).append(" )");
    } else if(StringUtils.isNotEmpty(condition.toString()) && !StringUtils.isNotEmpty(condition.toString()) && StringUtils.isNotEmpty(condition.toString())) {
           // Two is empty.. skip two
            query.append(ApplicationConstants.AND+"(");
            query.append("( ").append(condition).append(" )");
            query.append(ApplicationConstants.AND);
            query.append("( ").append(condition3).append(" )");
    } else if(!StringUtils.isNotEmpty(condition.toString()) && StringUtils.isNotEmpty(condition2.toString()) && StringUtils.isNotEmpty(condition3.toString())) {
        // One is empty , two and three are good to go
        query.append(ApplicationConstants.AND+"(");
        query.append("( ").append(condition2).append(" )");
        query.append(ApplicationConstants.AND);
        query.append("( ").append(condition3).append(" )");
        query.append(" )");
    
    } else {
        // If only 3 is there.
        query.append(ApplicationConstants.AND+"(");
        query.append("( ").append(condition3).append(" )");
        query.append(" )");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-17
      • 2015-12-28
      • 2020-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多