Это плохо для записи:
if (b == false) //...
while (b != true) //...
Это всегда лучше, чтобы вместо этого записать:
if (!b) //...
while (!b) //...
По-видимому, нет никакой разницы в производительности (или есть ли?), но как Вы взвешиваете явность, краткость, ясность, удобочитаемость, и т.д. между двумя?
Для ограничения субъективности я также ценил бы любые кавычки из авторитетных инструкций по стилю кодирования, по которым всегда предпочтительно или чтобы использовать когда.
Примечание: имя переменной b
просто используется в качестве примера, крыла foo
и bar
.
Это не обязательно плохо, это просто лишнее. Кроме того, фактическое имя переменной имеет большое значение. Я бы предпочел, например, if (userIsAllowedToLogin)
выше if (b)
или даже хуже if (flag)
.
Что касается производительности, компилятор оптимизирует ее любым способом.
Обновление : что касается авторитетных источников, я не могу найти что-то явно в Sun Coding Conventions , но по крайней мере Checkstyle имеет SimplifyBooleanExpression
, который предупреждал бы об этом.
Не следует использовать первый стиль. Я видел, как люди использовали:
if (b == true)
if (b == false)
Мне лично трудно читать, но это приемлемо. Однако большая проблема, с которой я столкнулся с этим стилем, заключается в том, что он приводит к невероятно нелогичным примерам, которые вы показали:
if (b! = True)
if (b! = False)
Это требует большего усилия со стороны читателя определить намерения авторов. Лично я считаю, что включение явного сравнения с истинным или ложным является избыточным и, следовательно, его труднее читать, но это я.
Лично я бы реорганизовал код, чтобы не использовать отрицательный тест. Например.
if (b == false) {
// false
} else {
// true
}
или
boolean b = false;
while(b == false) {
if (condition)
b = true;
}
ИМХО, в 90% случаев код можно реорганизовать, поэтому отрицательный тест не требуется.
ИМХО, я думаю, если вы просто добавите к именам переменных типа bool "Is"
, это будет самоочевидно и более значимо. а затем вы можете удалить явное сравнение с true
или false
Пример:
isEdited // use IsEdited in case of property names
isAuthorized // use IsAuthorized in case of property names
etc
Основная причина, по которой вы не должны использовать первый стиль, заключается в том, что оба они допустимы:
if (b = false) //...
while (b = true) //...
То есть, если вы случайно пропустите один символ, вы создадите присвоение вместо сравнения. Выражение присваивания оценивается как значение, которое было присвоено, поэтому первая инструкция выше присваивает значение false
b
и оценивает как false
. Второй присваивает true
b
, поэтому он всегда оценивается как true
, независимо от того, что вы делаете с b
внутри цикла.
Это дело вкуса.
Лично я обнаружил, что if (! A) {
намного менее читабельный (РЕДАКТИРОВАТЬ: для меня), чем if (a == false) {
и, следовательно, больше подвержены ошибкам при поддержке кода позже, и я перешел на использование последней формы.
В основном мне не нравится выбор символов для логических операций вместо слов (C против Pascal), потому что для меня a = 10, а не b = 20
читать легче, чем a = = 10 &&! (B == 20)
, но так оно и есть в Java.
Любой, кто отвергает подход "== false" в пользу "!" явно никогда не смотрел на код слишком долго и пропустил этот восклицательный знак. Да, вы можете получить слепой код.
Я никогда не видел первого, кроме написанного кода новичками; всегда последнее, и я не думаю, что это кого-то действительно смущает. С другой стороны, я думаю, что
int x;
...
if(x) //...
vs
if(x != 0) //...
гораздо более спорно, и в этом случае я предпочитаю второй
Я предпочитаю первое, потому что оно понятнее. Машина может одинаково хорошо читать и то, и другое, но я стараюсь писать код, чтобы его могли читать другие люди , а не только машина.
На мой взгляд, это просто раздражает. Но я бы не стал причиной шума.
Я бы сказал, что это плохо.
while (!b) {
// do something
}
читается гораздо лучше, чем
while (b != true) {
// do something
}