Извлечение вложенного метода if-object-null-return или альтернатива для когнитивной сложности гидролокатора - PullRequest
0 голосов
/ 04 сентября 2018

В большинстве случаев, когда объект является необязательным, можно использовать Guava, чтобы помочь в случае проверки на нуль. Но в тех случаях, когда утверждение используется, чтобы решить, будет ли метод возвращаться раньше (из того, что я испытал), даже этого недостаточно.

Мой вопрос касается использования вложенных операторов if для возврата значения по умолчанию вместо продолжения выполнения метода.

Вот пример того, что я имею в виду:

private MyObject myMethod(Object object, Object object1, Object object2) {

    /* inherent implementations for first if-statement... */
    if (object == null) {

        /* inherent implementations for second if-statement... */
        if (object1 == null) {
            return new MyObject();
        }

        /* inherent implementations for third if-statement... */    
        if (object2 == null) {
            return new MyObject();
        }

    } else {

        /*same structure shown in if-statement...*/

    }

    /* inherent implementations before last return statement... */

    return new MyObject(/* with args */);

}

Я ищу решение, которое решает проблемы когнитивной сложности, указанные sonarQube, в которых количество операторов if и if, используемых в методе, увеличивает сложность кода.

Другими словами, способы извлечения операторов из метода в другой метод или их решения другими способами, не требующими операторов if.

РЕДАКТИРОВАТЬ (05/09) : Во-первых, спасибо за все предоставленные ответы, но я полагаю, что есть некоторая деталь, которую я забыл упомянуть. Каждый из /* implementations... */, упомянутых в приведенном мною фрагменте кода, обладает определенным типом функциональных возможностей, которые должны быть выполнены до следующего оператора if, поэтому предложения типа if (object1 == null || object2 == null) не нужны. О предложении использовать Optional.or в Java 9: ​​из того, что я слышал, Java 8 является в настоящее время наиболее стабильной версией Java, поэтому в худшем случае мне придется ждать Java 11. Также каждый из упомянутых /* implementations... */ имеет чтобы быть выполненным по порядку, чтобы сделать каждую из этих деталей более явной, я немного переработал фрагмент кода, который я предоставил ранее.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Чтобы проверить, являются ли некоторые ваши параметры нулевыми, вы можете создать такой метод:

public boolean hasNull(Object... objects) {
    return Arrays.stream(objects).anyMatch(Objects::isNull);
}

Теперь вы можете проверить столько параметров, сколько хотите:

private MyObject myMethod(Object object, Object object1, Object object2, Object object3, Object object4) {

    if (hasNull(object1, object2, object3, object4)) {
        return new MyObject();
    }

    /* implementations... */

    return new MyObject(/* with args */);

}
0 голосов
/ 04 сентября 2018

Ответы с точки зрения чистого кода:

  • Не используйте столько аргументов. Сначала это звучит глупо, но: реальный ответ заключается в разработке интерфейсов, которые принимают как можно меньше параметров. Таким образом, вместо передачи a, b, c в качестве параметров можно создать класс вокруг них. Что дает вам больше возможностей думать о значениях по умолчанию и т. Д.
  • Конечно, возможны и ранние возвращения.

Ваш код говорит: same structure as shown in if statement. Тогда простое решение сделать

if (object1 == null) return new MyObject();
if (object2 == null) return new MyObject();

один раз , перед любым другим кодом. Дело в том, чтобы избегать вложенности условий. А когда вы просто повторяете условия, тогда ставьте их в другое место и избегайте повторения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...