Это хорошая практика, чтобы проверить на нулевое значение и проверить свойства объекта в том же операторе if - PullRequest
1 голос
/ 28 марта 2011

Является ли хорошей практикой проверять нулевое значение и проверять свойства объекта в одном и том же операторе if?

Рассмотрим следующий код:

if (jamesBlunt != null && jamesBlunt.isReallyBad()) {
   // Don't buy his records
}

Этот конкретный код написан на Java, и я знаю, что выражение вычисляется слева направо, так что технически оно не выдает исключение NullPointerException, но в целом это хорошая практика на любом языке?

Ответы [ 4 ]

3 голосов
/ 28 марта 2011

Поскольку вы используете оператор OR, будет NullPointerException, если jamesBlunt равно нулю.Вы должны использовать and, потому что, если левый оператор ложен, все выражение будет ложным.

Использование:

if (jamesBlunt != null && jamesBlunt.isReallyBad()) {
   // Don't buy his records
}

Когда Java 7 отключена, вы можете использовать ярлык

if(jamesBlunt?.isReallyBad() {
       // Don't buy his records
}

Но до тех пор явная проверка для null будет лучшей практикой.(На самом деле было бы лучше, если бы не использовал объекты jamesBlunt ...)

1 голос
/ 28 марта 2011

Лично я бы их отделил. Нулевая проверка - это то, что нужно делать в начале функции, и обычно она выполняется для проверки параметров функции и обычно называется «защитными предложениями». Эти проверки часто вызывают исключение или возвращают код ошибки, как определено функцией.

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

1 голос
/ 28 марта 2011

Я предполагаю, что || является опечаткой, а вы имели в виду &&:)

Чтобы ответить на ваш вопрос: это зависит.

Имеет ли смысл jamesBluntкогда-либо быть нулевым?Если нет, то было бы лучше иметь что-то вроде этого:

void buyARecord(Artist jamesBlunt) {
    if (jamesBlunt == null) {
        throw new IllegalArgumentException("James should never be null!");
    }
}

Если имеет смысл для jamesBlunt быть нулевым, тогда ваш подход в порядке, предполагая null и isReallyBadозначать то же самое семантически.Если они означают разные вещи семантически, то вам, вероятно, не следует объединять их в одну строку.

Вы должны быть осторожны на других языках.Многие (Java, C ++, C # и т. Д.) Будут вести себя одинаково, но некоторые могут оценивать справа налево или оценивать лениво.Будьте особенно внимательны с функциональными языками, такими как Lisp и Scheme, поскольку они, как правило, ведут себя иначе, чем объектно-ориентированные языки, такие как Java и C #.

1 голос
/ 28 марта 2011

Вы хотите использовать && вместо ИЛИ.

Да, хорошей практикой является проверка на нулевое значение в том же операторе if, альтернатива (вложение двух ifs) уродлива, потому что добавляет больше отступов.

Но проверка перед тоже возможна: специальноесли вы хотите сделать некоторые проверки ошибок.

...