Что является более понятной формой: if (! Value) или if (flag == value)? - PullRequest
54 голосов
/ 04 июня 2010

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

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

Не оператор

if (!value)

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

if (value == false)

Ответы [ 18 ]

69 голосов
/ 04 июня 2010

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

EDIT

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

if (MyWallet.IsEmpty)

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

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

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

28 голосов
/ 05 июня 2010

Лично мне нравится

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

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

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

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

<grin/>

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

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

20 голосов
/ 04 июня 2010
if (!value)

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

if (value == false)

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

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

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

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

13 голосов
/ 05 июня 2010

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

  • isWhatever
  • hasWhatever
  • и т.д.

Что-то вроде

if (Page.IsPostback == true)

мне кажется избыточным

13 голосов
/ 05 июня 2010

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

11 голосов
/ 05 июня 2010

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

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

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

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

1010 *, например *

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

//but

if(checkValue == false){}
//If (I've) not checkValue doesn't quite work here grammatically.
6 голосов
/ 05 июня 2010

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

2 голосов
/ 05 июня 2010

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

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

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

1 голос
/ 07 июня 2010

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

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

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

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

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

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

В целом, это аргумент для ключевых слов в стиле Perl unless и until.

...