В программировании жаргона , условия Yoda (называемые также Yoda обозначением ) является стилем программирования , где обе части выражения перепутана от типичного порядка в условном операторе . Условие Йоды помещает постоянную часть выражения в левую часть условного оператора.
Условия Йоды являются частью стандартов кодирования Symfony [1] и WordPress [2] .
Источник
Название этого стиля программирования происходит от персонажа « Звездных войн» по имени Йода , который говорит по-английски с нестандартным синтаксисом . Томас М. Туэрке утверждает, что ввел термин « нотация Йоды» и впервые опубликовал его в Интернете в 2006 году. [3] По его словам, термин « условие Йоды» позже был популяризирован Феликсом Клотье в 2010 году.
Пример
Обычно условный оператор записывается как:
if ( $ value == 42 ) { / * ... * / } // Читается как: «Если значение равно 42 ...»
Условия Йоды описывают то же выражение, но в обратном порядке:
if ( 42 == $ value ) { / * ... * / } // Читается так: "Если 42 равно значению ..."
Константа записывается слева от оператора сравнения , а переменная, значение которой сравнивается с константой, записывается справа. Этот порядок сопоставим с нестандартным англоязычным стилем Йоды, который представляет собой примерно объект – субъект – глагол [4] (например, «Когда ты достигнешь девятисот лет, ты не будешь выглядеть так хорошо» [5] [ 6] ).
Преимущество
Обнаружение ошибок
Размещение постоянного значения в выражении не меняет поведения программы (если только значения не имеют ложного значения - см. Ниже). В языках программирования, которые используют единственный знак равенства ( =
) для присваивания, а не для сравнения, возможная ошибка заключается в непреднамеренном присвоении значения вместо написания условного оператора.
if ( myNumber = 42 ) { / * ... * / } // Это присваивает 42 myNumber вместо оценки желаемого условия
Использование условий Йоды:
if ( 42 = myNumber ) { / * ... * / } // Это синтаксическая ошибка, и она не будет компилироваться
Поскольку 42 является постоянным и не может быть изменен, эта ошибка будет поймана с помощью компилятора .
Логическое myBoolean = true ; if ( myBoolean = null ) { / * ... * / } // Это вызывает исключение NullPointerException в среде выполнения Java, но допустимо при компиляции.
Как избежать некоторых типов небезопасного нулевого поведения
Условия Йоды помогают справиться с небезопасным поведением в некоторых ситуациях.
String myString = null ; if ( myString . equals ( "foobar" )) { / * ... * / } // Это вызывает исключение NullPointerException в Java
С условиями Йоды:
String myString = null ; if ( "foobar" . equals ( myString )) { / * ... * / } // Это ложь, как и ожидалось
Критика
Условия Йоды широко критикуются за ухудшение читабельности из-за увеличения когнитивной нагрузки при чтении кода. [7] [8] [9]
Некоторые языки программирования (такие как Swift и версии Python ниже 3.8) не позволяют присваивать переменные в условных выражениях - например, требуя, чтобы присваивания не возвращали значение, или определяя как часть своей грамматики инвариант, согласно которому условия не могут содержать операторы присваивания. - в этом случае эту ошибку невозможно обнаружить (то есть она будет обнаружена синтаксическим анализатором как синтаксическая ошибка до того, как программе когда-либо будет разрешено войти в среду выполнения ). [10] Многие компиляторы выдают предупреждение для кода, например if (myNumber = 42)
(например, опция GCC -Wall
предупреждает, предлагает скобки вокруг присваивания, используемого в качестве значения истинности ), которое предупреждает программиста о вероятной ошибке. В динамических языках, таких как JavaScript , линтеры, такие как ESLint, могут предупреждать о назначении внутри условного выражения. [11]
Преимущество предотвращения нулевого поведения также можно рассматривать как недостаток, поскольку ошибки нулевого указателя могут быть скрыты и появятся в программе только намного позже.
Другой недостаток появляется в C ++ при сравнении неосновных типов, поскольку == является оператором и может не быть определена подходящая перегруженная операторная функция. Пример: CComBSTR
сравнение Microsoft со строковым литералом , записанным как if (L"Hello" == cbstrMessage)
, не сопоставляется с функцией перегрузки. [12]
Рекомендации
- ^ «Стандарты кодирования (вклад в Symfony)» . Symfony.com . Проверено 12 ноября 2016 .
- ^ «Стандарты кодирования PHP - сделайте ядро WordPress» . make.wordpress.com . Проверено 15 августа 2019 .
- ^ «Обозначение Йоды (также известное как Условие Йоды) - Происхождение термина» . 2013-04-17 . Проверено 26 декабря 2020 .
- ^ Пуллум, Джеффри К. (18 мая 2005 г.). «Трибуна анализирует синтаксис Йоды; я расскажу подробнее!» . Itre.cis.upenn.edu . Журнал языков . Проверено 22 декабря 2014 .
Один из способов взглянуть на синтаксис Йоды - это то, что он показывает признаки предпочтения синтаксиса OSV (Object-Subject-Verb) в качестве основного порядка в простом предложении.
- ^ «StarWars.com 10: Лучшие цитаты Йоды» . starwars.com . Лукасфильм, ООО 26.11.2013 . Проверено 22 декабря 2014 .
Когда тебе исполнится девятьсот лет, ты не будешь выглядеть так хорошо.
- ^ «Цитаты для Йоды (персонажа)» . imdb.com . Amazon . Проверено 22 декабря 2014 .
Когда девятисотлетнему * ты * достигнешь, выглядишь так же хорошо * ты * не будешь, хм?
- ^ «Быстрые советы по снижению когнитивной нагрузки на ваш код» . 21 марта 2017 года.
- ^ «Почему использовать условия Йоды, наверное, не стоит» . 2 августа 2017 года.
- ^ «Условия Йоды: почему вы не должны их использовать» . 16 августа 2017 года.
- ^ «Язык программирования Swift (Swift 3.0.1): основные операторы» . Developer.apple.com . 2016-10-27 . Проверено 12 ноября 2016 .
- ^ «запретить операторы присваивания в условных операторах» . eslint.org . Проверено 17 февраля 2017 .
- ^ «CComBSTR :: оператор» . Msdn.microsoft.com . Проверено 12 ноября 2016 .
Внешние ссылки
- united-coders.com: Что такое условия Йоды? Примеры на Java
- Условия Йоды кажутся очень вредными Как эта техника может принести гораздо больше вреда, чем пользы