В последнее время я много работал над PHP и, в частности, в рамках WordPress. Я замечаю много кода в виде:
if ( 1 == $options['postlink'] )
Где бы я ожидал увидеть:
if ( $options['postlink'] == 1 )
Это соглашение встречается в определенных языках / структурах? Есть ли какая-либо причина, по которой первый подход предпочтительнее второго (с точки зрения обработки, или анализа, или даже с точки зрения человека?)
Или это просто вопрос вкуса? Я всегда думал, что лучше при выполнении теста, чтобы переменный элемент, проверяемый по некоторой константе, был слева. Кажется, это лучше соответствует тому, как мы задаем вопрос на естественном языке: «если торт - шоколад», а не «если шоколад - торт».
Ответы:
Основная причина сделать это (так называемое «условие Йоды») состоит в том, чтобы предотвратить несчастные случаи, когда вы случайно используете оператор присваивания (
=
) вместо оператора сравнения (==
).То есть, если вы допустили ошибку, сделав:
Оператор оценивает
true
(или, в случае некоторых языков, например, PHP, истинное значение), и у вас будет трудно найти ошибку.Но если вы сделали:
Вы получите фатальную ошибку, потому что не можете присвоить
$foo
целое число.Но, как вы указали, изменение порядка обычно делает вещи менее читабельными. Таким образом, многие стандарты кодирования (но не все, включая WordPress ) предлагают или требуют,
$foo == 1
несмотря на преимущества поиска ошибок1 == $foo
.В общем, мой совет - следовать любому установленному стандарту кодирования, если он есть: для WordPress это означает использование условий Yoda.
Когда нет, и невозможно установить его путем консенсуса с вашими коллегами, это выбор дилера.
источник
:=
оператором присваивания (с помощью==
теста на равенство), чтобы избежать такого рода проблем.=
вместо==
. Разница настолько подчеркнута везде, что я просто никогда не путаю их. С другой стороны, я прочитал много частей кода, которые сбивают с толку или иным образом трудно понять. Поэтому я бы поставил приоритеты на удобочитаемость :). В любом случае, хороший ответ.-Wall -Werror
или эквивалент вашего компилятора / интерпретатора. Есть очень немного ситуаций, когда назначение внутри условия является правильным, не говоря уже о том, что оно более читабельно. Многие языки этого даже не позволяют.if($foo = 1)
значениеtrue
в некоторых языках, в PHP это имеет значение 1 вместо;if($foo = 20)
оценивает до 20;if($foo = 0)
оценивается в 0, что в отличие от других является ложным. Это может добавить еще один слой сложности к ошибке.Это защитный механизм кодирования, предназначенный для предотвращения случайного использования оператора присваивания.
Рассмотрим неправильное использование / ошибку оператора присваивания вместо оператора равенства
Приведенное выше условие всегда будет возвращать true, но, вероятно, это не то, что имел в виду оригинальный программист. Считайте, что в этом месте это
Здесь PHP (и большинство других языков) отказались бы работать, поскольку невозможно присвоить что-либо фиксированному значению
1
. Таким образом, кодируя все условные операторы, вы автоматически гарантируете отсутствие случайного использования оператора назначения в условном выражении.источник
Мне нравится использовать это соглашение в Java, чтобы удалить возможность исключения нулевого указателя. Поэтому что-то вроде этого не вызовет у вас никаких проблем и не потребует дополнительного кода:
источник
На практике многие компиляторы будут предупреждать вас, если вы напишите «if (x = 1)» вместо «if (x == 1)», поскольку это, скорее всего, ошибка.
С Clang вы можете избежать предупреждения, фактически говоря компилятору: «Я имею в виду, и я знаю, что я делаю», а это можно сделать, написав «if ((x = 1))». Обратите внимание на дополнительные скобки. Это работает и в других ситуациях. утверждение if (false); может дать вам предупреждение, что заявление никогда не выполняется; оператор if ((false)); не дает этого предупреждения.
источник
if ($array = getSomething()){ // ..so something with $array }