Подтвердить что ты не робот

Вы предпочитаете "if (var)" или "if (var!= 0)"?

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

if (var)    // in C
if ($var)   # in Perl

когда я имел в виду:

if (var != 0)
if (defined $var and $var ne '')

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

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

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

Каковы ваши предпочтения и почему?

4b9b3361

Ответ 1

Мне нравится, когда мой if имеет смысл читать вслух:

if (is_it_happening) ...
if (number_of_sheep != 0) ...
if (pointer_to_something != NULL) ...

Ответ 2

Я предпочитаю

if (var != 0)

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

Ответ 3

Это довольно просто. if( var ) тесты на правдивость. if( var != 0 ) проверяет, что это не число 0. ОНИ НЕ ОБНАРУЖЕНЫ! Есть три причины.

Во-первых, использование if( var != 0 ) для проверки истины сложнее. Там просто читать и понимать. Вы должны понять, что != и 0 - это идиома для "is true". Не имея отличительной визуальной схемы, вам нужно немного научиться, чтобы понять, что это не то же самое, что if( var == 0). Это тонкое различие, но стоит упомянуть. Тот факт, что стиль if( 0 != var ) существует, дает доверие. Лучше всего устранить проблему и использовать if( var ) для правды.

Во-вторых, и что более важно, намерение должно быть ясным. Испытываете ли вы правду или проверяете ли вы число (или их отсутствие)? if( var ) проверяет достоверность, if( var != 0 ) проверяет число. Для определения чего-либо еще требуется знание стиля автора, что мы должны предположить, что программист по обслуживанию не делает.

В-третьих, здесь есть предположение о значении истинных и ложных и числовых операторов, которые могут возникать на некоторых языках, а не в других. В Perl, и я думаю, что Javascript тоже пустая строка является ложной. Многие операторы возвращают пустую строку для false. Поэтому проверка истины с помощью if( var != 0 ) приводит к предупреждению. Это становится более резким, когда вы делаете что-то более наивное, например, if( var == 1 ), чтобы понимать истину, явно опасное предположение. Мне кажется, что многие младшие программисты пишут это и, в свою очередь, записывают функции, которые возвращают нечетные, но истинные числа, чтобы наказать такого рода вещи. Или, когда я нахожусь в настроении, я дезинфицировал свое возвращаемое значение с помощью return var ? 1 : 0.

В связанной заметке Perl вернет последнее оцениваемое выражение из подпрограммы, поэтому нет необходимости писать return. Объедините это с идеей, которую люди имеют, что явный return работает медленнее, и вы получаете много людей, злоупотребляющих этим фактом.

sub set {
    my( $self, $key, $value ) = @_;

    $self->{$key} = $value;
}

set вернет $value. Это было предназначено? Я не знаю. Я знаю, кто-то начнет полагаться на него. И программист по обслуживанию не будет знать, могут ли они изменить его. Поэтому мне нравится явно возвращать в каждую нетривиальную подпрограмму.

sub set {
    my( $self, $key, $value ) = @_;

    $self->{$key} = $value;
    return;
}

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

Ответ 4

if (var)

Меньше набрать, если вы уверены, что не тестируете неправильную вещь.

Ответ 5

Я предпочитаю явные тесты, если результат внутри круглых скобок не является явным логическим. Фраза "if (1)", хотя и синтаксически и семантически корректна в терминах языка, не является логической. Это должно быть правдой или ложью, а не автоматически.

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

Я также презираю яростный код формы:

if (gotError == FALSE) ...
if (isComplete == TRUE) ...

Если логическое значение правильно названо (и должно быть), правильный способ сделать это:

if (!gotError) ...
if (isComplete) ...

Это потому, что (используя reductio ad absurdum) boolVal == TRUE является просто еще одним булевым значением, поэтому, где вы остановились?

if (isComplete == TRUE) ...
if ((isComplete == TRUE) == TRUE) ...
if (((isComplete == TRUE) == TRUE) == TRUE) ...
if ((((isComplete == TRUE) == TRUE) == TRUE) == TRUE)...

И так далее, до бесконечности.

Ответ 6

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

Но опять же этот стиль настолько популярен, вероятно, не слишком большой, но из моей работы с С# я пишу свой код на С++ в этом стиле:

Boolean или int, в основном логическое:

if (val)

Истинное целое число с большим значением true/false:

if (val != 0)

Указатель какого-то типа:

if (val != NULL)

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

Ответ 7

В Perl if (defined $var and $var ne '') и if( $var) НЕ эквивалентны. Попробуйте с помощью $var=0. И наоборот, если вы тестируете на $var!=0, все строки, которые не могут быть преобразованы в числа, не пройдут тест (с предупреждением, если вы их включили).

Итак, вы должны точно знать, что содержит ваша переменная (число или строка, может ли она быть undef), чтобы вы могли соответственно протестировать.

Обычно я пишу if( $var) и позволяю Perl позаботиться об этом. Я считаю, что читать легче и что самый распространенный стиль в Perl.

Очень часто на самом деле правильный тест заканчивается if( defined $var). То, что удобно использовать perl new (in 5.10) //. $var= $val // $default или часто $var //= $default, где $var получит $default, только если $val (resp $var) undef.

Ответ 8

В Javascript (я не знаю других динамических языков)

if (x) 

и

if (x != 0)

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

Ответ 9

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

if ( var )
if ( $var )

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

$shouldDoSomething = ( defined $var and $var ne '' ) ? 1 : 0;

if ( $shouldDoSomething ) {
    // Handle this case.
}

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

if ( defined $var and $var ne '' ) {
    // Handle this case.
}

Ответ 10

Я читаю, как и большинство людей, мне нравится проверять свой код и читать его, не думая слишком много, оно идет рука об руку, но с именами имен с именами. Если ваши имена переменных заставляют его звучать так, как будто он должен быть простым if(isPurchasable), тогда я иду с ним, однако он ссылается на число или дату или подобное fasion, которые я использую if(stock > 0).

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

if(isPurchasable && stock > 0 && credit >= cost && !reserved) { 
     // Checks to see if customer can purchase product.
}

Ответ 11

Для числовых скаляров значения, я склонен писать if ( $num_foo ), когда $num_foo находится под моим контролем. Если его пользователь вводит или передает его извне, я либо сначала его нумерую, либо четко излагаю тест. Это зависит от множества факторов. Основным критерием является то, когда и как его удобно иметь дело со значениями undefined, чтобы избежать предупреждений.

Чтобы проверить непустую строку, я использовал для записи if ( $foo ), потому что правильное заклинание просто слишком много печатает:

if ( defined $foo and length $foo )

Но я не был удовлетворен этим положением, поэтому Я подтолкнул к изменению поведения для length undef в Perl 5.12, что бросает предупреждение и возвращает 0 до Perl 5.10 включительно. В 5.12 он просто тихо вернет undef. Поэтому в небулевых контекстах вы все равно получаете предупреждение, это происходит только после того, как вызов length оценивается, а не раньше. Но в логических контекстах нет предупреждения, поэтому проверка на непустую строку намного проще сделать правильно:

if ( length $foo )

Ответ 12

У меня есть несколько способов сделать это:

для булевых:

if (x)

для ints:

if (x != 0)  // always compare, never assume true/false on int values

для указателей:

if (x /* != 0 */)  // I've always done this, not sure where I picked it up but I like it

В наши дни я думаю, что лучше иметь вызов функции, который описывает, что на самом деле означает логика в выражении if

EDIT: Заметьте, 0 (intsead of NULL) - это потому, что в основном я использую С++ в наши дни

Ответ 13

Я удивлен, что никто не упомянул о другом варианте, который стандарты кодирования у моего прежнего работодателя поддерживали:

if( 0 != x );

В тех случаях, когда константа всегда была указана первыми (что особенно важно при сравнении, поскольку они иногда получают опечатки для назначений - источник многих ошибок)

Это стиль я использовал до сих пор в моем C/Perl/С++/VB.Net, так как (очевидно, точка становится спорной в С# whihc фактически не позволяет if (x) сценарий (если й не является на самом деле булевым, конечно).

Ответ 14

В С# было сделано явно незаконным писать

if(x){}

если x не является булевым типом. Нет никакого неявного преобразования в bool из большинства других типов.

Я использовал эту форму для написания JavaScript, PHP и таких, чтобы проверить, не имеет ли значение null. Но опять же, я получил несколько (легко обнаружимых) ошибок из этого... Думаю, нам лучше без него.

При использовании этого параметра в булевых переменных я твердо верю в легко читаемые имена. Я обычно называю логические переменные, используемые как имена, начинающиеся с "is", "has" или что-то подобное.

Ответ 15

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

Мне очень не нравятся конструкции вроде if (!strcmp(...)) или if (var == true). Первый пытается быть слишком умным, второй слишком тупой - хотя он хорошо масштабируется до if ((var == true) == true),...; -)

Некоторые языки, такие как Perl и С++, предоставляют дополнительные или даже пользовательские интерпретации истинности. Если преобразование в логическое значение кажется слишком волшебным, помните, что в основном это просто is_true(var) или var.booleanValue(), или что-то вроде этого за сценой, всего лишь более сжатый синтаксис.

В связи с вашим вопросом, я хотел бы сформулировать условия в позитивном ключе. Вместо

if (!condition) {
    g();
}
else {
    f();
}

Я предпочитаю

if (condition) {
    f();
}
else {
    g();
}

Даже если есть только одна ветвь, и условие не очень просто. (Указанием для этого является необходимость комментария.) Например, вместо

// explain reason for condition here
if (!condition) {
    f();
}

Я предпочитаю выражать его как

if (condition) {
    // explain condition here
}
else {
    f();
}

Ответ 16

К моему способу мышления, простота лучше.

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

if(var)

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

Ответ 17

Я не всегда справляюсь с этим, но я стараюсь использовать

if (0 != var)

чтобы он соответствовал защитному стилю

if (0 == var)

Ответ 18

Я предпочитаю голый:

if ($canDo) {
}

вместо чего-то вроде:

if ($canDo == true) {
}

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

my($canDo) = !0;

к

my($canDo) = 1;

Последнее запутывает; зачем назначать дискретное значение логическому?

Учитывая, что Perl имеет много значений для "оценки истины", я вижу, почему более явное более практично в долгосрочной перспективе. Тем не менее, одной из вещей, которые мне больше всего нравятся в Perl, является ее естественная лингвистическая текучесть, и я предпочитаю в своем коде придерживаться этого (оставляя комментарии и имена переменных для дальнейшего уточнения вещей, если это необходимо).

Ответ 19

Если у вас есть int-bool в C, который уже содержит флаг (а не счет), и вы тестируете его с помощью "if (var!= 0)", где он заканчивается? Не было бы "если ((var!= 0)!= 0)" быть еще лучше?: -)

Ответ 20

VBScript? Ну, этот бит кода объявляет вариант, поэтому bFlag равен нулю, что фактически является False.

Dim bFlag
If bFlag Then

Мне это не нравится. Поэтому даже в VB, с возможностью более конкретных объявлений, я обнаруживаю, что явный, независимо от типа.

Dim bFlag As Boolean
If bFlag = False Then

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

Ответ 21

Очень часто я использую:

 if(x) {
       DoSomething;
       DoSomething2;
     }

Потому что это меньше написания и книга, в которой говорится:

Немногие хорошие программисты используют форму , если (x!= 0), они используют , если (x).

Но иногда используется и другая форма:

if(x!=0) 

HNY!: -)

Ответ 22

Я нахожу, что если (X) {/*... */} намного легче читать (по крайней мере на C).

Ответ 23

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

Ответ 24

По-моему, if (var != 0) лучше.

Ответ 25

Мне нравятся конструкции Python:

if var:
    return "I like the way I do it!"

Это просто, например: -)

Ответ 26

Есть языки, в которых у вас нет выбора. Например, в Specman вы не можете писать:

var x: uint;

if (x) {
    bla
};

Но вы можете сделать:

var x: uint;

if (x != 0) {
    bla
};

или

var x: bool;

if (x) {
    bla
};

Однако вы не можете сделать:

var x: bool;

if (x != 0) {
    bla
};

Потому что вы не можете сравнивать логическое с целым числом.

Из C и Perl я всегда думал, что это раздражает, пока я не начал писать много в Specman. Код просто понятнее.