Assignments in conditions (присваивания в условиях)

в 12:37, , рубрики: php, метки:

Недавно во время code review на моем проекте у меня возникли разногласия с коллегами. Касались они следующего кода:

if (false == ($var = foo())){...}

Сразу несколько действительно хороших разработчиков считали этот код абсолютно неприемлемым. Особенно показательным был аргумент моего коллеги Тимофея: «Assignments в conditions — это зло, об этом рассказывают на первой лекции по программированию». Возможно, но т.к у меня небыло ни одной лекции по программированию, предлагаю все-таки разобраться почему это зло.

Итак, все вы знаете как работают условия и операторы сравнения в php.
В примере ниже значение переменной $var приводится к булевскому, и если оно равно true условие выполняется.
if ($var){...}

В этом примере сравниваются значения переменной $var и результата выполнения foo() и если они эквивалентны — условие выполняется.
if ($var == foo()){...}

Здесь в условии переменной $var присваивается результат выполнения foo(), после чего значение $var приводится к булевскому, и если оно равно true — условие выполняется.
if ($var = foo()){...}

Последний пример хоть и допустим в php, но действительно плохо читается, т.к в условии отсутствуют операторы сравнения. Нередко такой код свидетельствует об ошибке, и программист на самом деле имел ввиду
if ($var == foo()){...}

При сравнение переменной с булевским значением с учетом типа часто пишут так
if (true === $var){...}

Делается это именно для того, чтобы избежать случайного присваивания переменно $var значения true, например вот такого
if ($var = true){...}

IDE тоже стараются предупредить разработчика, если он использует присваивание в условии. Вот пример из Eclipse
Assignments in conditions (присваивания в условиях)

Вернемся к коду, который вызвал разногласия
if (false == ($var = foo())){...}

Здесь переменной $var присваивается результат выполнения foo(), который сравнивается с false. Разница этого примера с тем, который я написал в Eclipse в том, что здесь в явном виде присутствует основной элемент условия — сравнение. Такой код прекрасно читается и не оставляет пространства для возможных опечаток. Eclipse считает его валидным
Assignments in conditions (присваивания в условиях)

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

Автор: mr_MAIL

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js