Использование оператора 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 (doSomething()) {
} else {
// blah
}
лучше, чем
if (!doSomething()) {
// blah
}
чем позже, тем яснее и лаконичнее.
кроме того ! оператор может появиться в сложных условиях, таких как (!си.) Как же тогда избежать этого?
использовать ! оператор, когда вам нужно.