Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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). Как вы его избегаете?

Используйте! если вам нужно.