简化嵌套 if else 循环 Java 中的认知复杂性
Simplifying nested if else loops Cognitive complexity in Java
我有一个用于构建本机 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 循环
谢谢!
简化可以包括一个概括:具有可变参数条件。
然后 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)
。
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(" )");
}
我有一个用于构建本机 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 循环
谢谢!
简化可以包括一个概括:具有可变参数条件。 然后 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)
。
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(" )");
}