Что является более понятной формой: if(! Value) или if(flag == value)?

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

Очевидно, что лучшим ответом является "рефакторинг кода, чтобы вам не нужно было проверять на ложность", но иногда нет простого способа сделать это, и ветвь "else" просто продолжает обработку. Поэтому, когда вы должны иметь конструкцию "если не ложь", которая является предпочтительным стандартом:

Не оператор

if (!value)

Или тест на ложь

if (value == false)

18 ответов

Решение

if (!value) легче / быстрее следовать. Субъективно, как вы сказали. Пока вы последовательны, это главное.

РЕДАКТИРОВАТЬ

Еще один момент, который нужно добавить - опускание ключевых слов true /false также должно (надеюсь) заставить кодировщика использовать переменные с лучшим именем. Переменные Bool всегда должны указывать значение или цель состояния, например:

if (MyWallet.IsEmpty)

Нет причин использовать вышеизложенное == false или же == true как это избыточно. Вышеизложенное легко читается человеком.

Гораздо лучше, чем расшифровывать

if (MyWallet.EmptyStatus == true) или что-то смешное, как это.

Мне лично нравится

if ((value == false) == true)...

потому что это подтверждает, что утверждение value is false на самом деле оценивается как логическое значение true...

а затем, очевидно, что охват обоих вариантов добавляет еще больше ясности,

if ((value == false) == true && (value == false) != false)

<grin/>

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

if (((value == false) == true && (value == false) != false) == true)

if (!value)

Это всегда яснее, на мой взгляд.

if (value == false)

Я ненавижу это говорить, потому что это звучит как бы подло, но обычно это показывает, что человек, пишущий код, на самом деле не понимает использование логических значений. Вам не нужно повторно проверять, что является логическим значением в операторе if. Это избыточно.

(Лично я был бы раздражен на человека тоже, если бы они назвали переменную value вместо чего-то более значимого. У меня есть ощущение, что вы разместили только код psuedo, я определенно определюсь с этим в обзоре.)

Изменить (в ответ на комментарий ниже):

Это может выглядеть банально, но часто это признак гораздо большего. По правде говоря, большинство людей, которые используют var == true и т. Д., Не понимают. Это просто факт. Я не говорю, что они глупые или они не должны быть программистами, просто есть что-то, что им нужно проанализировать и изучить. Проблема в том, что когда логика становится намного более сложной, непонимание таких понятий может привести к гораздо более серьезным проблемам в будущем. Некоторые люди говорят, что это стиль. Все в порядке. Реальный вопрос в этом случае: "Как мне выгодно делать это таким образом? Что я или другие люди получаем от этого?" Если вы не можете однозначно ответить на этот вопрос, тогда вам нужно спросить себя: "Почему это хорошая идея?"

if(!value) понятнее и более "элегантно", особенно если правильно назвать логические переменные

  • isWhatever
  • hasWhatever
  • так далее

Что-то вроде

if (Page.IsPostback == true)

кажется излишним для меня

Я бы никогда не использовал if(value == true)так что просто для согласованности я бы тоже не пользовался if(value != false),

Особое мнение (вид)

С точки зрения компиляции вы получите тот же самый IL, так что он действительно имеет значение только с точки зрения читабельности.

С этой точки зрения if(value == false) для обычного читателя более очевидно, и меньше шансов пропустить! до булла.

Честно говоря, я использую оба подхода, и в большинстве случаев я делаю это зависящим от имени моей переменной. Если все еще звучит нормально сказать "нет" вместо "взрыва", я, скорее всего, буду использовать обозначение взрыва

например

if(!gotValue) {}
//if (I've) not gotValue

//but

if(checkValue == false){}
//If (I've) not checkValue doesn't quite work here grammatically.

Я использую Not value при кодировании в VB, но, как правило, использовать value == false при кодировании в C#. Я считаю, что восклицательный знак иногда может быть потерян в имени переменной (например,! Legal). Может быть, это потому, что я опытный ветеран.

Я бы предпочел использовать if(!value) потому что, в зависимости от имен задействованных переменных, "истинный" случай имеет гораздо больше смысла в соответствии с английской семантикой.

Рассмотрим один из примеров в этой статье MSDN:

if(pane.IsChecked)

на английском языке читается как "Если панель проверена".

Однако если (pane.IsChecked == true) по-английски гласит: "Если флажок панели установлен, верно". Это утверждение гораздо менее ясно на английском, чем должно быть.

Одной из причин, по которой мы не пишем код на C# в двоичном коде, является читаемость человеком. Если вам предоставлен выбор между кодом, который хорошо работает, когда вы читаете его, и кодом, который этого не делает, за исключением того, который более читабелен. Я не думаю, что добавление== true"делает этот пример более читабельным, и MSDN тоже так не считает.

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

Я обычно предпочел бы, чтобы (! Value) тоже, когда я точно знаю, что значение является логическим. Но часто это может быть строка или число.

Нулевое число будет оцениваться как ложное в условных выражениях во многих языках (хотя и не во всех); однако строка "0" будет иметь значение true. Это проблема особенно в JavaScript, особенно если вы получаете строки JSON с сервера, особенно если сервер написан на PHP (потому что большинство разработчиков PHP достаточно небрежны, чтобы просто брать значения из БД и вызывать на них json_encode, не зная, что БД выдает строки и не имеет ни малейшего представления о том, что все эти нули и единицы, которые они используют в качестве логических полей, будут кодироваться как строки на другом конце, поэтому все они рассматриваются как истинные в условных выражениях).

Рэнт закончен. Мое предложение: будьте явными, особенно если ваш язык является "очень динамичным" типом (например, JavaScript, PHP, Perl).

Прошу прощения, второй кажется мне глупым.

Я бы добавил дополнительный уровень, если кто-то предпочитает это:

if( (value==false) == true )

:)

Что бы вы ни предпочли. Выберите один и придерживайтесь его.

Я поддерживаю if (!value) стиль по крайней мере для оценки переменных или общих свойств, таких как Page.IsPostback и тому подобное. Для чего-то более сложного я стремлюсь заключить выражение в скобки следующим образом:

if (!(SomeType.SomeProperty.CallingAMethod(input).GetSomething.BooleanProperty))

Просто чтобы привлечь к нему немного больше внимания.

В общем, это аргумент в пользу Perl-стиля unless а также until ключевые слова.

Я предпочитаю второй вариант, if (value == false) один. Я с удовольствием пользуюсь if (~value) или же if (not value) на языках, которые это поддерживают, но это ! просто слишком легко объединяет waaaaay с именем переменной или открывающими скобками или | или || операторы... по крайней мере, на мой взгляд.

Также две вещи:

  1. Я никогда не делаю if (value == true)и я знаю, что я непоследователен И хотя последовательность, на мой взгляд, очень важна, ! это просто хуже.
  2. Я думаю, что это действительно вопрос личного вкуса, так же, как дебаты о скобках на новой строке. Я бы никогда не стал критиковать товарища по команде за такие глупые мелочи, и мне трудно понять людей, которые будут.

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

Он попадает в ту же категорию, что и

if (value) {
  return true;
} else {
  return false;
}

OTOH, все ответы, приведенные здесь, делают мое первое утверждение в некоторой степени не верным.

Безотносительно условия if блок должен оценить, чтобы выполнить должен оценить true,

Следовательно, когда value является false, причина по которой if (!value) позволяет if блок для выполнения, потому что ! оператор по существу переворачивает false ценность value в trueтаким образом, чтобы результирующее условие в скобках оценивалось в true тот, который if Блок нужно для того, чтобы выполнить.

if (value), if (!value), if (flag == value), if (value == true), if (value == false)В зависимости от того, что должно быть достигнуто, действительный код. Например if (value == true) очень полезно, когда value обнуляемый логический, потому что if (value) выдаст синтаксическую ошибку, и if (value.Value == true) выбросит исключение, если вы не гарантировали, что value не является нулевым перед if блок выполнен.

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

if ( ! created)

Даже при использовании OpenDyslexic в качестве шрифта знак not! рядом с открывающей скобкой ( может быть слишком близко, чтобы различить его с первого взгляда if(!created).

Если условие является просто проверкой одного значения, то !value быстрее

Тем не менее, когда условие содержит несколько проверок значений, я считаю, что это гораздо легче читать value == false, Каким-то образом легче проанализировать множественные проверки на равенство, чем множественные отрицания значений.

Я на самом деле много форм возможны.

На самом деле это не так, как написано в стандартах, но я вижу это так:

//if foo is(or exists)
if(foo)

//if foo is true
if(foo == true)

//if foo doesn’t exist
if(!foo)

if foo is false
if(foo == false)

Следовательно, я не вижу == ложь избыточна.

Я использую if (value == false) The! если (!value) настолько мало, я иногда скучаю по нему.

Другие вопросы по тегам