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

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

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

или это

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

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

if (IsGood)
{
   DoSomething();
}

или

if (!IsGood)
{
   DoSomething();
}

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

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

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

Ответы [ 41 ]

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

Почему-то мне всегда нравилось

if (IsGood)

более

if (!IsBad)

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

unless (IsBad)

и даже больше, если используется так:

raise InvalidColor unless AllowedColors.include?(color)
1 голос
/ 10 декабря 2008

Ах, у меня есть несколько сотрудников, предпочитающих более длинную форму, утверждая, что она более читабельна, чем крошечная!

Я начал «исправлять» это, так как логические значения самодостаточны, тогда я отбросил крестовый поход ... ^ _ ^ Они не любят чистить код здесь, во всяком случае, утверждая, что это затрудняет интеграцию между ветвями правда, но тогда ты вечно живешь с плохо выглядящим кодом ...).

Если вы правильно напишите логическое имя переменной, оно должно выглядеть так:
if (isSuccessful) против if (returnCode)

В некоторых случаях я мог бы заниматься булевым сравнением, например:
if (PropertyProvider.getBooleanProperty(SOME_SETTING, true) == true) потому что он читается меньше "естественно".

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

Мне кажется (хотя у меня нет доказательств, подтверждающих это), что люди, начинающие на языках типов C # / java, предпочитают метод "if (CheckSomething ())", тогда как люди, начинающие на других языках (C ++) : в частности, Win32 C ++) склонны использовать другой метод по привычке: в Win32 «if (CheckSomething ())» не будет работать, если CheckSomething возвращает BOOL (вместо bool); и во многих случаях функции API явно возвращают 0/1 int / INT, а не значение истина / ложь (каковым является BOOL).

Я всегда использовал более многословный метод, опять же, по привычке. Они синтаксически одинаковы; Я не покупаю ерунду "многословие раздражает меня", потому что программист - это не тот, кого должен впечатлять код (это делает компьютер). И в реальном мире уровень квалификации любого конкретного человека, смотрящего на написанный мною код, будет варьироваться, и у меня нет времени или желания объяснять особенности оценки высказываний тому, кто не понимает, что-то незначительное такие биты.

1 голос
/ 30 октября 2009

Если вы работаете в Perl, у вас есть опция

unless($isGood)
1 голос
/ 11 декабря 2008

Cybis, при кодировании на C ++ вы также можете использовать ключевое слово not . Это часть стандарта с давних времен, так что этот код совершенно действителен:

if (not foo ())
   bar ();

Редактировать: Кстати, я забыл упомянуть, что стандарт также определяет другие логические ключевые слова, такие как и (&&), bitand (&), или (||), bitor (|), xor (^) ... Они называются синонимами операторов.

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

Я не использую ==, но иногда я использую !=, потому что это более ясно в моей голове. НО на моей работе мы не используем != или ==. Мы пытаемся получить имя, которое имеет значение, если с hasXYZ() или isABC().

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

Лично я предпочитаю форму, о которой говорит дядя Боб в Чистом коде:

(...)
    if (ShouldDoSomething())
    {
        DoSomething();
    }
(...)

bool ShouldDoSomething()
{
    return IsGood;
}

где условные выражения, кроме самых тривиальных, помещаются в предикатные функции. Тогда не имеет значения, насколько читаема реализация логического выражения.

1 голос
/ 30 октября 2009

Если вы действительно думаете, что вам нужно:

if (Flag == true)

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

if ((Flag == true) == true)

и так далее. Сколько еще гвоздей нужно этому гробу?

0 голосов
/ 16 октября 2009

Я бы

if (isGood) {
  doSomething();
}

и

if (isNotGood) {
    doSomethngElse();
}

Читается лучше.

0 голосов
/ 16 октября 2009

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

if (isValidDate == true) {
    if (isValidQuantity == true) {
         if (isOtherThingValid == true) {
              bool result = doThing();
              if (result == true) {
                   thatWorked();
         } // long block of code that tries to compensate for OtherThing's invalidness
    } // obtuse function call to a third party library to send an email regarding the invalid quantity
} // is this the function close brace or the if...

Это сводит меня с ума, отчасти поэтому я выработал привычку делать вещи наоборот:

if (isValidDate == false) {
    logThisProblem("Invalid date provided.");
    return somethingUseful;
}

if (isValidQuantity == false) {
    logThisProblem("Invalid quantity provided.");
    return somethingUseful;
}

if (isOtherThingValid == false) {
    logThisProble("Other thing not valid.");
    return somethingUseful;
}

// OK ... we've made it this far...
bool result = doThing(date, quantity, otherThing);
...