2010-06-04 3 views
51

Я понимаю, что это субъективный вопрос, поэтому я приношу свои извинения, если его нужно закрыть, но я чувствую, что он достаточно часто возникает, когда я задаюсь вопросом, есть ли вообще предпочтение одной форме над другой.Какая более ясная форма: if (! Value) или if (flag == value)?

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

не оператор

if(!value) 

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

if(value == false) 
+0

Существует также возможность: (value! = True). Лично я не считаю, что какой-то конкретный менее желателен, чем другие. –

+35

Преимущество первого заключается в том, что вы не можете сделать, если (shouldLaunchMissiles = false) – JRL

+5

Похоже, что это субъективный вопрос, предполагая, что сообщество считает, что ответы ценны и хотят сохранить его, может ли кто-нибудь сделать этот вопрос вики? Я не хочу, чтобы кто-нибудь «отвечал» на этот вопрос, действительно честен, потому что нет абсолютно правильного ответа. – CodexArcanum

ответ

66

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

EDIT

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

if(MyWallet.IsEmpty)

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

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

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

+5

Правда, консистенция - самая ценная вещь. – CodexArcanum

+2

@CodexArcanum: Но быть последовательно неправильным или постоянно нечитаемым является Bad Thing. – David

+4

@ KP: Проголосовали. Большой смысл в именах переменных. Ваш ответ показывает, как одно решение в стиле кодирования может легко повлиять на другие решения в стиле кодирования и помочь кому-то, кто впервые видит код, понять его как можно быстрее. – David

21
if(!value) 

Это, по моему мнению, всегда яснее.

if(value == false) 

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

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

Edit (в ответ на комментарий ниже):

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

+6

+1 для комментария к пониманию. Я согласен с тем, что разработчики с менее концептуальным пониманием кода склоняются к использованию '== false', позволяя логическому значению говорить само за себя, особенно когда я вижу' if (value == true) '. –

+0

Я признаю, что вторая форма выглядит глупой и избыточной, но я часто вижу ее в примере кода. Как правило, причина заключается в том, что он очень четко указывает на быстрое сканирование кода, что тестируется, исходя из предположения, что быстрое сканирование может пропустить «!». Я предполагаю, что цель состоит в том, чтобы удалить камнем преткновения, который может заставить читателя остановиться и растратить несколько секунд, глядя ближе к заявлению. – CodexArcanum

+0

Хорошо, если (значение == true) просто глупо. В C# в любом случае, он может иметь достоинство на языке, таком как Javascript, где if (value) тестирует как логическую истину, так и проверку нуля. – CodexArcanum

1

Независимо от того, что вы предпочитаете. Выберите один и придерживайтесь его.

+2

Плохая идея, когда на одной и той же кодовой базе имеется более одного разработчика. –

+0

@Pavel - это подпадает под 'Pick one and stick it' :). – IVlad

+0

до некоторой степени, да :) это больше похоже на выбор одного глобального, и придерживайтесь его, что так хорошо, потому что вопрос. Это делает этот вопрос действительным. –

13

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

+8

'if (value! = False)' ... Приятно! –

+3

if (value! = False) ... это просто послало дрожь по моему позвоночнику .... приятно :) – kemiller2002

+1

+1 ха-ха, любите тщательность! – SwDevMan81

13

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

  • isWhatever
  • hasWhatever
  • т.д.

Что-то вроде

if (Page.IsPostback == true) 

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

+4

+1. например, 'while (! done)' Считывает как «while not done», что намного яснее, чем 'while (done == false)', который, в свою очередь, читается как «while done is false». Стиль обычного кодирования имеет свой собственный язык. –

26

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

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

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

и, затем, очевидно, охватывающий как posssibilites добавляет еще больше ясности,

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

<grin/>

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

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

+9

Ах, вы старый шаблон шаблон избыточности. –

+18

if (((значение == false) == true) .ToString(). Length == 4) ... :) – Nagg

+0

И чтобы быть еще яснее, вы можете добавить '&& (значение == false)! = false' –

0

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

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

5

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

+2

У меня так много приправы, что я начинаю заставлять мои волосы выглядеть серыми и застревать в моих морщинах. – Robaticus

+1

Слишком плохо, что C# не имеет ключевого слова 'not' (например, C++), которое отлично выглядит. –

11

несогласное мнение (вид)

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

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

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

например.

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

//but 

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

Сожалею, что второе выглядит глупо для меня.

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

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

:)

2

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

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

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

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

+2

Напоминает мне функцию IsTrue (значение bool). – sunside

1

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

Рассмотрим один из примеров в this MSDN article:

if(pane.IsChecked) 

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

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

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

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

0

Я на самом деле много форм.

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

//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) 

Поэтому я не вижу == ложь является излишним.

+5

Это проблема с переменным доступом. Дайте foo имя, которое похоже на вопрос, на который вы можете ответить ДА или НЕТ. например, например. «IsFoo» или «FooExists» или даже «FooIsTrue», тогда вам просто нужно сказать: «Если FooExists тогда dosomething». Вы можете видеть, что «если только Foo» не является вопросом, есть что-то, что не может быть действительно вопросом, и – OlimilOops

2

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

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

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

1

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

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

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

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

+0

Это то, что я тоже делаю. Когда я использую '!', Чтобы отрицать выражение, я всегда заключу выражение в круглые скобки, как вы сказали, чтобы привлечь к нему немного больше внимания. Я думаю, что это добавляет читаемости, особенно при использовании частных переменных/классов, которые начинаются с подчеркивания: 'if (! _ WhateverThisThing.TriesToDo())' будет записываться как: 'if (! (_ WhateverThisThing.TriesToDo())). ИМХО отсутствует '!' Сложнее на последнем. – Sharky

1

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

Кроме того, две вещи:

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

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