Действительно ли хорошая практика избегать использования оператора NOT в условиях IF, чтобы сделать код более читаемым? Я слышал, что if (doSomething())
лучше, чем if (!doSomething()).
Использование оператора NOT в условиях ЕС
Ответ 1
Это действительно зависит от того, что вы пытаетесь выполнить. Если у вас нет предложения else, тогда if(!doSomething())
кажется прекрасным. Однако, если у вас
if(!doSomething()) {
...
}
else {
// do something else
}
Я бы, вероятно, отменил эту логику, чтобы удалить оператор !
и сделать предложение if
немного более понятным.
Ответ 2
Как общее утверждение, полезно сделать ваши условия 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 вместо того, чтобы копать переменные в области. Это также полезно для работы с NPE - разбор кода на более простые куски всегда хорош.
Ответ 3
Нет, нет ничего плохого в использовании оператора !
в операторах if..then..else
.
Именование переменных, а в вашем примере - это то, что важно. Если вы используете:
if(!isPerson()) { ... } // Nothing wrong with this
Однако:
if(!balloons()) { ... } // method is named badly
Все сводится к удобочитаемости. Всегда стремимся к тому, что является самым читаемым, и вы не ошибетесь. Всегда старайтесь также продолжать работать над своим кодом, например, посмотрите на ответ Билла Ящериц .
Ответ 4
В общем,! является совершенно хорошим и читаемым логическим логическим оператором. Нет причин не использовать его, если вы упрощаете удаление двойных негативов или применение закона Моргана.
!(!A) = A
или
!(!A | !B) = A & B
Как правило, держите подпись ваших логических методов возврата мнемонической и в соответствии с конвенцией. Проблема со сценарием, который предлагает @hvgotcodes, заключается в том, что, конечно, a.b и c.d.e не очень дружелюбные примеры для начала. Предположим, у вас есть класс Flight and Seat для заявки на бронирование рейса. Тогда условие для бронирования полета вполне может быть чем-то вроде
if(flight.isActive() && !seat.isTaken())
{
//book the seat
}
Этот прекрасно читаемый и понятный код. Вы можете переопределить логическую логику для класса Seat и перефразировать условие на это.
if(flight.isActive() && seat.isVacant())
{
//book the seat
}
Таким образом, удаление! если это действительно вас беспокоит, но вы увидите, что все зависит от того, что означают ваши булевские методы.
Ответ 5
Как правило, неплохая идея избегать! -оператора, если у вас есть выбор. Одна простая причина заключается в том, что это может быть источником ошибок, потому что это можно игнорировать. Более читаемым может быть: if (conditionA == false) в некоторых случаях. Это в основном играет роль, если вы пропустите часть else. Если в любом случае у вас есть else-block, вы не должны использовать отрицание в if-условии.
За исключением сложенных условий:
if(!isA() && isB() && !isNotC())
Здесь вы должны использовать какое-то отрицание, чтобы получить нужную логику. В этом случае, о чем стоит подумать, это назначение функций или переменных. Попробуйте назвать их, чтобы вы могли часто использовать их в простых условиях без отрицания.
В этом случае вы должны думать о логике isNotC(), и если его можно заменить методом isC(), если это имеет смысл.
Наконец, ваш пример имеет еще одну проблему, когда дело доходит до читаемости, которая еще более серьезна, чем вопрос о том, использовать ли отрицание или нет: действительно ли читатель кода знает, когда doSomething() возвращает true и когда false? Если это было ложно, это было сделано в любом случае? Это очень распространенная проблема, которая заканчивается тем, что читатель пытается выяснить, что означают возвращаемые значения функций.
Ответ 6
попробуйте это
if (!(a | b)) {
//blahblah
}
То же самое с
if (a | b) {}
else {
// blahblah
}
Ответ 7
Я никогда не слышал об этом раньше.
Как
if (doSomething()) {
} else {
// blah
}
лучше, чем
if (!doSomething()) {
// blah
}
Позднее более ясный и лаконичный.
Помимо! оператор может появиться в сложных условиях, таких как (! a || b). Как вы его избегаете?
Используйте! если вам нужно.