Условия Йоды - Yoda conditions

В программирование жаргон, Условия Йоды (также называемый Обозначение Йоды) это стиль программирования где две части выражения перевернуты от типичного порядка в Условный оператор. Условие Йоды помещает постоянную часть выражения в левую часть условного оператора. Название этого стиля программирования происходит от Звездные войны персонаж по имени Йода, ВОЗ говорит на английском с нестандартным синтаксисом.

Условия Йоды являются частью Symfony[1] и WordPress[2] стандарты кодирования.

Пример

Обычно условный оператор записывается как:

если ($ значение == 42) { /* ... */ }// Читается как: «Если значение равно 42 ...»

Условия Йоды описывают то же выражение, но в обратном порядке:

если (42 == $ значение) { /* ... */ }// Читается так: "Если 42 равно значению ..."

Константа пишется слева от оператор сравнения, а переменная, значение которой сравнивается с константой, записывается справа. Этот порядок сопоставим с нестандартным англоязычным стилем Йоды, который примерно объект – субъект – глагол[3] (например, «Когда ты достигнешь девятисот лет, ты не будешь выглядеть так хорошо».[4][5]).

Преимущество

Обнаружение ошибок

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

если (мой номер = 42) { /* ... */ }// Это присваивает 42 myNumber вместо оценки желаемого условия

Используя условия Йоды:

если (42 = мой номер) { /* ... */ }// Это синтаксическая ошибка и не будет компилироваться

Поскольку 42 - это постоянный и не может быть изменена, эта ошибка будет пойманный посредством компилятор.

Булево myBoolean = истинный;если (myBoolean = ноль) { /* ... */ }// Это вызывает исключение NullPointerException в среде выполнения Java, но допустимо при компиляции.

Как избежать некоторых типов небезопасного нулевого поведения

Условия Йоды помогают справиться с небезопасным поведением в некоторых ситуациях.

Нить myString = ноль;если (myString.равно("foobar")) { /* ... */ }// Это вызывает исключение NullPointerException в Java

С условиями Йоды:

Нить myString = ноль;если ("фубар".равно(myString)) { /* ... */ }// Это неверно, как и ожидалось

Выражая математику

Условия Йоды легче понять, если выражение представляет действительная числовая линия.

если -1 <= Икс <= 1:

Без йоды условий:

если ((Икс >= -1) && (Икс <= 1)) { /* ... */ }

С условиями йоды:

если ((-1 <= Икс) && (Икс <= 1)) { /* ... */ }

Критика

Условия Йоды широко критикуются за ухудшение читабельности за счет увеличения когнитивная нагрузка чтения кода.[6][7][8]

Некоторые языки программирования (например, Быстрый и версии Python ниже 3.8) не допускают присвоения переменных в условных выражениях - например, требуя, чтобы присвоения не возвращали значение, или путем определения как части их грамматика инвариант, что условия не могут содержать операторы присваивания - в этом случае с этой ошибкой невозможно столкнуться (то есть она будет обнаружена как синтаксическая ошибка парсером до того, как программе когда-либо будет разрешено войти в время выполнения ).[9] Многие компиляторы выдают предупреждение для кода, например если (myNumber = 42) (например, GCC -Стена вариант предупреждает предлагать скобки вокруг присвоения, используемого как значение истинности), который предупреждает программиста о вероятной ошибке. В динамических языках, таких как JavaScript, линтеры например, ESLint может предупреждать о назначении внутри условного.[10]

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

Еще один недостаток появляется в C ++ при сравнении неосновных типов, поскольку == является оператором и может не быть подходящего перегруженный оператор функция определена. Пример: Microsoft CComBSTR сравнить с строковый литерал, записанный как if (L "Привет" == cbstrMessage), не отображается на функцию перегрузки.[11]

Рекомендации

  1. ^ "Стандарты кодирования (вклад в Symfony)". Symfony.com. Получено 2016-11-12.
  2. ^ «Стандарты кодирования PHP - сделайте ядро ​​WordPress». make.wordpress.com. Получено 2019-08-15.
  3. ^ Пуллум, Джеффри К. (18 мая 2005 г.). «Трибуна анализирует синтаксис Йоды; я расскажу подробнее!». Itre.cis.upenn.edu. Журнал языков. Получено 2014-12-22. Один из способов взглянуть на синтаксис Йоды - это то, что он показывает признаки предпочтения синтаксиса OSV (Object-Subject-Verb) в качестве основного порядка в простом предложении.
  4. ^ "The StarWars.com 10: Лучшие цитаты Йоды". starwars.com. Лукасфильм, ООО 26.11.2013. Получено 2014-12-22. Когда тебе исполнится девятьсот лет, ты не будешь выглядеть так хорошо.
  5. ^ «Цитаты для Йоды (Персонаж)». imdb.com. Amazon. Получено 2014-12-22. Когда девятисотлетнему * ты * достигнешь, выглядеть так же хорошо * ты * не будешь, хм?
  6. ^ «Быстрые советы по снижению когнитивной нагрузки на ваш код». 21 марта 2017 года.
  7. ^ «Почему, вероятно, не стоит использовать условия Йоды». 2 августа 2017 года.
  8. ^ «Условия Йоды: почему вы не должны их использовать». 16 августа 2017 года.
  9. ^ «Язык программирования Swift (Swift 3.0.1): основные операторы». Developer.apple.com. 2016-10-27. Получено 2016-11-12.
  10. ^ "запретить операторы присваивания в условных операторах". eslint.org. Получено 2017-02-17.
  11. ^ «CComBSTR :: оператор». Msdn.microsoft.com. Получено 2016-11-12.

внешняя ссылка