Должен ли я использовать `! IsGood` или` IsGood == false`? - PullRequest
46 голосов
/ 10 декабря 2008

Я постоянно вижу код, который проверяет, как это

if (IsGood == false)
{
   DoSomething();
}

или это

if (IsGood == true)
{
   DoSomething();
}

Я ненавижу этот синтаксис и всегда использую следующий синтаксис.

if (IsGood)
{
   DoSomething();
}

или

if (!IsGood)
{
   DoSomething();
}

Есть ли причина использовать '== true' или '== false'?

Это удобочитаемость? Люди просто не понимают булевых переменных?

Кроме того, есть ли разница в производительности между ними?

Ответы [ 41 ]

0 голосов
/ 13 декабря 2008

Мне нравится использовать разные стили в зависимости от именования переменных, например:

Переменные, названные с префиксом, таким как Is, Has и т. Д., С которым, глядя на имя, очевидно, что я использую булевы значения:

if(IsSomething)

но если у меня есть переменные, у которых нет такого префикса, я бы хотел использовать

if(Something == true)

Какую форму вы используете, вы должны решить, основываясь на языке программирования, на котором вы ее используете. Значение

if(Something) and if(Something == true)

может иметь разное значение в разных языках программирования.

0 голосов
/ 13 декабря 2008

На языке типа C, где нет типа "Boolean", я рекомендую более длинный путь, например

if (is_good == True)
{
}

Причина в том, что is_good не только true / false (скорее всего, реализовано как символ) и, следовательно, может быть повреждено другими значениями или неправильно настроено.

Так что же хорошего в этом? Ваш код сможет обнаружить любые проблемы с неправильной установкой is_good, потому что без проверки == True или == False все будет иметь значение true;) И если вы действительно имеете в виду логическое значение, то это плохо. *

0 голосов
/ 11 декабря 2008

Один размер подходит не всем. Иногда более краткая форма может быть сделана простой или идиоматичной, например! (X% y), которая возвращает «True», если y является фактором x.

В других случаях более явное сравнение было бы более полезным. [(x, y) для x в диапазоне (10) для y в диапазоне (10), если не (x и y)] не так просто, как [(x, y) для x в диапазоне (10) для y в диапазоне (10) if (x == 0 или y == 0)]

0 голосов
/ 10 декабря 2008

Единственный раз, когда я могу подумать, где более подробный код имел смысл, был до .NET Visual Basic, где true и false были фактически целыми числами (true = -1, false = 0) и логические выражения считались ложными, если они вычисляли в ноль и истина для любых других ненулевых значений. Таким образом, в случае старого VB два перечисленных метода на самом деле не были эквивалентны, и если вы только хотели, чтобы что-то было истинным, если оно оценивается как -1, вы должны явно сравнить с «истиной». Таким образом, выражение, которое оценивается как «+1», будет истинным, если будет оценено как целое число (потому что оно не равно нулю), но оно не будет эквивалентно «истинному». Я не знаю, почему VB был спроектирован таким образом, но я вижу много логических выражений, сравнивающих переменные с true и false в старом коде VB.

0 голосов
/ 11 декабря 2008

Я думаю, это действительно зависит от языка.

Скажем, в PHP некоторые функции могут возвращать false и возвращать неотрицательные числа.

Тогда:

if(foo(bar)) { ... }
Схема

не будет работать слишком хорошо, потому что вы не можете определить между возвратом false или 0.

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

0 голосов
/ 10 декабря 2008

В некоторых случаях это действительно полезно, хотя и не часто.

Вот пример. В ActionScript 2 логические значения имеют 3 возможных значения:

  • правда
  • ложь
  • нуль / неопределенный

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

function myFunc(b:Boolean):Void {
  if(b == true) {
    // causes b to default to false, as null/undefined != true
  }
}

OR

function myFunc(b:Boolean):Void {
  if(b != false) {
    // causes b to default to true, as null/undefined != false
  }
}

в зависимости от того, какое значение я хочу использовать по умолчанию. Хотя, если мне нужно будет использовать логическое значение несколько раз, я сделаю что-то вроде этого:

function myFunc(b:Boolean):Void {
  b = (b == true); // default to false
}

OR

function myFunc(b:Boolean):Void {
  b = (b != false); // default to true
}
0 голосов
/ 10 декабря 2008

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

if (IsGood == false) лучше, чем if(!IsGood).

При сканировании кода легко ошибиться "!" предшествующая переменной bool для символа в переменной bool.

0 голосов
/ 10 декабря 2008

Кодирование на C # / C ++ / Java / и т.д ... Я всегда предпочитаю

if (something == true)<br/> if (something == false)

над

if (something)<br/> if (!something)

потому что восклицательный знак трудно увидеть с первого взгляда, если бы я не использовал большой шрифт (но тогда я бы увидел меньше кода на странице - не все из нас могут позволить себе мониторы с диагональю 24 дюйма +). не нравится быть непоследовательным и использовать if (something) и if (something == false)

Когда я пишу код на Python, я почти всегда предпочитаю

if something:<br/> if not something:

потому что «не» ясно видно.

0 голосов
/ 11 декабря 2008

Пока у нас либо if (isGood), либо if (!isGood), все в порядке.

Иногда я сталкиваюсь с таким кодом ...

if (!getGreatGrandFateher.getGrandFather().getFather().getFirstChild().isMale())
{
   doSomething();
}

На первый взгляд это вводит в заблуждение, что doSomething называется, если это мужчина. Маленький '!' после того, как "если" теряется в большой конструкции кода, как указано выше.

Явная проверка, как показано ниже, обеспечивает лучшую читаемость

if(getGreatGrandFateher.getGrandFather().getFather().getFirstChild().isMale() == false)
{
   doSomething();
}
0 голосов
/ 10 декабря 2008

Хотя это не практическая разница, я всегда рассматриваю == как числовой оператор, и как таковой он не применим к логическим типам. Ближайший логический оператор - это «эквивалентность» (не исключающий или), который не имеет оператора в стиле C.

Таким образом, строго логический тест становится

if (!(IsGood ^ true))

В качестве иллюстрации проблем с числовыми операторами в логических значениях, что такое логическая оценка

true / 2
...