Это плохо для явного сравнения с булевыми константами, например, если (b == ложь) в Java?

Это плохо для записи:

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

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

Это всегда лучше, чтобы вместо этого записать:

if (!b) //...

while (!b) //...

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

Обновление

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


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

72
задан polygenelubricants 19 April 2010 в 02:58
поделиться

10 ответов

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

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

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

66
ответ дан 24 November 2019 в 12:30
поделиться

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

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

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

  • if (b! = True)
  • if (b! = False)

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

47
ответ дан 24 November 2019 в 12:30
поделиться

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

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

или

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

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

2
ответ дан 24 November 2019 в 12:30
поделиться

ИМХО, я думаю, если вы просто добавите к именам переменных типа bool "Is" , это будет самоочевидно и более значимо. а затем вы можете удалить явное сравнение с true или false

Пример:

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

etc

7
ответ дан 24 November 2019 в 12:30
поделиться

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

if (b = false) //...

while (b = true) //...

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

25
ответ дан 24 November 2019 в 12:30
поделиться

Это дело вкуса.

Лично я обнаружил, что if (! A) { намного менее читабельный (РЕДАКТИРОВАТЬ: для меня), чем if (a == false) { и, следовательно, больше подвержены ошибкам при поддержке кода позже, и я перешел на использование последней формы.

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

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

34
ответ дан 24 November 2019 в 12:30
поделиться

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

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

vs

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

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

11
ответ дан 24 November 2019 в 12:30
поделиться

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

6
ответ дан 24 November 2019 в 12:30
поделиться

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

1
ответ дан 24 November 2019 в 12:30
поделиться

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

while (!b) {
    // do something 
}

читается гораздо лучше, чем

while (b != true) {
    // do something 
}
0
ответ дан 24 November 2019 в 12:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: