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

Плохо ли это явно сравнивать с булевыми константами, например. if (b == false) в Java?

Плохо ли писать:

if (b == false) //...

while (b != true) //...

Всегда лучше писать:

if (!b) //...

while (!b) //...

Предположительно, нет никакой разницы в производительности (или есть?), но как вы взвешиваете объяснительность, краткость, ясность, читаемость и т.д. между ними?

Update

Чтобы ограничить субъективность, я также ценю любые цитаты из авторитетных правил стиля кодирования, которые всегда предпочтительнее или которые следует использовать, когда.


Примечание: имя переменной b используется как пример, ala foo и bar.

4b9b3361

Ответ 1

Это не обязательно плохо, это просто лишнее. Кроме того, фактическое имя переменной сильно различается. Я бы предпочел, например, if (userIsAllowedToLogin) выше if (b) или даже хуже if (flag).

Что касается производительности, то компилятор каким-либо образом оптимизирует ее.

Обновить: что касается авторитетных источников, я не могу найти что-то явно в Sun Coding Conventions, но по крайней мере Checkstyle имеет SimplifyBooleanExpression модуль который предупредил бы об этом.

Ответ 2

Нельзя использовать первый стиль. Я видел, как люди использовали:

  • if ( b == true )
  • if ( b == false )

Мне лично трудно читать, но это сносно. Однако большая проблема, с которой я сталкиваюсь в этом стиле, заключается в том, что это приводит к невероятно противоречивым примерам, которые вы показали:

  • if ( b != true )
  • if ( b != false )

Это требует больше усилий со стороны читателя, чтобы определить намерения авторов. Лично я считаю, что явное сравнение с истинным или ложным является избыточным и, следовательно, более трудным для чтения, но что я.

Ответ 3

Это сильно зависит от вкуса.

Лично я обнаружил, что if (!a) { намного менее читаемый (EDIT: для меня), чем if (a == false) { и, следовательно, больше подвержен ошибкам при сохранении кода позже, и я преобразовал его в последнюю форму.

В основном мне не нравится выбор символов для логических операций вместо слов (C по сравнению с Pascal), потому что для меня a = 10 and not b = 20 читается легче, чем a == 10 && !(b==20), но так оно и есть в Java.

Любой, кто ставит "== ложный" подход в сторону "!" явно никогда не уставился на код слишком долго и пропустил этот восклицательный знак. Да, вы можете получить код-слепой.

Ответ 4

Основной причиной, почему вы не должны использовать первый стиль, является то, что оба из них действительны:

if (b = false) //...

while (b = true) //...

То есть, если вы случайно оставите один символ, вы создадите задание вместо сравнения. Выражение присваивания оценивается значением, которое было назначено, поэтому первый оператор выше присваивает значение false - b и оценивает false. Второй присваивает true b, поэтому он всегда оценивает true, независимо от того, что вы делаете с b внутри цикла.

Ответ 5

Я никогда не видел первого, кроме кода, написанного новичками; это всегда последнее, и я не думаю, что кто-то действительно смущен этим. С другой стороны, я думаю,

int x;
...
if(x) //...

против

if(x != 0) //...

гораздо более спорно, и в этом случае я предпочитаю второй

Ответ 6

IMHO, я думаю, если вы просто сделаете имена переменных bool, добавленные с помощью "Is", это будет самоочевидным и более значимым, а затем вы можете удалить явное сравнение с true или false

Пример:

isEdited  // use IsEdited in case of property names
isAuthorized // use IsAuthorized in case of property names

и т.д.

Ответ 7

Я предпочитаю первый, потому что он яснее. Машина может читать одинаково хорошо, но я пытаюсь написать код для других людей, чтобы читать, а не только машину.

Ответ 8

Я предпочитаю длинный подход, но я сравниваю использование == вместо != 99% времени.

Я знаю, что этот вопрос касается Java, но я часто переключаюсь между языками, а в C#, например, сравнение с (для isntance) == false может помочь при работе с обнуленными типами bool. Поэтому я получил эту привычку сравнивать с true или false, но с помощью оператора ==.

Я делаю это:

if(isSomething == false) или if(isSomething == true)

но я их ненавижу:

if(isSomething != false) или if(isSomething != true)

по очевидным причинам удобочитаемости!

Пока вы сохраняете свой код читаемым, это не имеет значения.

Ответ 9

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

if (b == false) {
   // false
} else {
   // true
}

или

boolean b = false;
while(b == false) {
  if (condition)
      b = true;
}

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

Ответ 10

По-моему, это просто раздражает. Не то, что я мог бы вызвать шум, хотя.

Ответ 11

Нормальное правило - никогда не проверять булево значение. Некоторые утверждают, что дополнительная многословность добавляет ясности. Добавленный код может помочь некоторым людям, но каждый читатель должен будет прочитать больше кода.

Сегодня утром я потерял полчаса, чтобы найти ошибку. Код был

    if ( !strcmp(runway_in_use,"CLOSED") == IPAS_FALSE)
      printf(" ACTIVE    FALSE \n");   else
      printf(" ACTIVE    TRUE \n");

Если бы он был закодирован с обычным соглашением, я бы увидел намного быстрее, что это было неправильно:

    if (strcmp(runway_in_use, "CLOSED"))
      printf(" ACTIVE    FALSE \n");   else
      printf(" ACTIVE    TRUE \n");

Ответ 12

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

for (Alert alert : alerts) {
    Long currentId = alert.getUserId();

    if (vipList.contains(currentId)) {
        customersToNotify.add(alert);

        if (customersToNotify.size() == maxAlerts) {
            break;
        }
    }
}

а другой

for (Alert alert : alerts) {
    Long currentId = alert.getUserId();

    if (!vipList.contains(currentId)) {
        customersToNotify.add(alert);

        if (customersToNotify.size() == maxAlerts) {
            break;
        }
    }
}

поэтому в этом случае имеет смысл создать метод, который работал для обоих условий, подобных этому, используя boolean == condition чтобы перевернуть значение

private void appendCustomersToNotify(List<Alert> alerts
        List<Alert> customersToNotify, List<Long> vipList, boolean vip){

    for (Alert alert : alerts) {
        Long currentId = alertItem.getUserId();

        if (vip == vipList.contains(currentId)) {
            customersToNotify.add(alertItem);

            if (customersToNotify.size() == maxAlerts) {
                break;
            }
        }
    }
}

Ответ 13

Я бы сказал, что это плохо.

while (!b) {
    // do something 
}

читается намного лучше, чем

while (b != true) {
    // do something 
}

Ответ 14

Одна из причин, по которой первый (b == false) недооценивается, заключается в том, что новички часто не понимают, что вторая альтернатива (! b) возможна вообще. Поэтому использование первой формы может указывать на неправильное представление с булевыми выражениями и логическими переменными. Таким образом, использование второй формы стало своего рода sjiboleth: когда кто-то пишет это, он, вероятно, понимает, что происходит.

Я считаю, что это заставило разницу считать более важной, чем она есть на самом деле.