Упрощение вложенных циклов if else Когнитивная сложность в Java - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть метод, который используется для создания собственного запроса sql. У меня есть 4 String Builder в качестве входных данных и на основе различных условий, мне нужно построить мой запрос.

Вот код

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(" )");
            }
        }
    }
}

Когда я запускаю свой отчет Sonar, он говорит Когнитивная сложность выше для этого метода. Могу ли я упростить этот метод, избегая многих циклов if-else

Спасибо!

Ответы [ 2 ]

2 голосов
/ 12 февраля 2020

Упрощение может состоять из обобщения: наличие различных условий. И тогда решение 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).

0 голосов
/ 12 февраля 2020
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(" )");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...