Использование оператора NOT в условиях IF

действительно ли рекомендуется избегать использования оператора NOT в условиях IF, чтобы сделать ваш код более читаемым? Я слышал if (doSomething()) лучше, чем if (!doSomething()).

7 ответов


Это действительно зависит от того, что вы пытаетесь достичь. Если у вас нет предложения else, то if(!doSomething()) вроде хорошо. Однако, если у вас есть

if(!doSomething()) {
    ...
}
else {
    // do something else
}

Я бы, вероятно, изменил эту логику, чтобы удалить ! оператор и принять if предложение немного более ясно.


как общее утверждение, его хорошо, чтобы сделать ваши условия if максимально читаемыми. Для вашего примера, используя ! ОК. проблема в том, когда вещи выглядят как

if ((a.b && c.d.e) || !f)

вы можете сделать что-то вроде

bool isOk = a.b;
bool isStillOk = c.d.e
bool alternateOk = !f

тогда ваш оператор if упрощен до

if ( (isOk && isStillOk) || alternateOk)

Он просто делает код более читаемым. И если вам нужно отлаживать, вы можете отлаживать набор isok vars вместо того, чтобы копаться в переменных в области. Также полезно для работы с NPEs-разбиение кода на более простые куски всегда хорошо.


нет, нет абсолютно ничего плохого в использовании ! оператор if..then..else заявления.

именование переменных и в вашем примере методы-это то, что важно. Если вы используете:

if(!isPerson()) { ... } // Nothing wrong with this
:
if(!balloons()) { ... } // method is named badly

все сводится к читабельности. Всегда стремитесь к тому, что является наиболее читаемым, и вы не ошибетесь. Всегда старайтесь держать свой код непрерывным, например, посмотрите на Bill The Lizards ответ.


в целом ! является совершенно хорошим и читаемым логическим оператором boolean. Нет причин не использовать его, если вы не упрощаете, удаляя двойные негативы или применяя закон Моргана.

!(!A) = A

или

!(!A | !B) = A & B

как правило, держите подпись ваших булевых методов возврата мнемонической и в соответствии с соглашением. Проблема со сценарием, что @hvgotcodes предлагает-это конечно.B и C.д.е не очень дружелюбный примеры для начала. Предположим вам имейте полет и класс места для заявки на бронирование рейса. Тогда условием для бронирования рейса вполне может быть что-то вроде

if(flight.isActive() && !seat.isTaken())
{
    //book the seat
}

это прекрасно читаемый и понятный код. Вы можете переопределить свою логику boolean для класса Seat и перефразировать условие для этого.

if(flight.isActive() && seat.isVacant())
{
    //book the seat
}
удаление ! оператор, если это действительно беспокоит вас, но вы увидите, что все зависит от того, что означают ваши булевы методы.

Это вообще не плохая идея, чтобы избежать !-оператор если у вас есть выбор. Одна из простых причин заключается в том, что он может быть источником ошибок, потому что его можно упустить. Более читаемым может быть: if (conditionA==false) в некоторых случаях. Это в основном играет роль, если вы пропустите часть else. Если у вас все равно есть блок else, вы не должны использовать отрицание в условии if.

кроме сочинил условий такой:

if(!isA() && isB() && !isNotC())

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

в этом случае вы должны подумать о логике isNotC () и если она может быть заменена методом isC (), если это имеет смысл.

наконец, у вашего примера есть еще одна проблема, когда дело доходит до читаемости, которая еще более серьезна, чем вопрос использовать отрицание или нет: действительно ли читатель кода знает, когда doSomething() возвращает true и когда false? Если это было ложью, было ли это сделано в любом случае? Это очень распространенная проблема, которая заканчивается тем, что читатель пытается выяснить, что на самом деле означают возвращаемые значения функций.


попробуйте так

if (!(a | b)) {
    //blahblah
}

то же самое с

if (a | b) {}
else {
    // blahblah
}

Я никогда не слышал об этом раньше.

Как

if (doSomething()) {
} else {
   // blah
}

лучше, чем

if (!doSomething()) {
   // blah
}

чем позже, тем яснее и лаконичнее.

кроме того ! оператор может появиться в сложных условиях, таких как (!си.) Как же тогда избежать этого?

использовать ! оператор, когда вам нужно.