Условия Йоды
На программирования жаргоне ( условия Йоды также называемые нотацией Йоды ) — это стиль программирования , при котором две части выражения меняются местами по сравнению с типичным порядком в условном операторе . Условие Йоды помещает константную часть выражения в левую часть условного оператора.
Условия Йоды являются частью стандартов кодирования Symfony. [1] и WordPress . [2]
Источник
[ редактировать ]Название этого стиля программирования происходит от из «Звездных войн» персонажа Йоды , который говорит по-английски с нестандартным синтаксисом. [3] (например: «Когда тебе исполнится 900 лет, ты не будешь выглядеть так хорошо». [4] [5] ). Томас М. Тёрке утверждает, что придумал термин «нотация Йоды» и впервые опубликовал его в Интернете в 2006 году. [6] По его словам, термин «состояние Йоды» позже популяризировал Феликс Клотье в 2010 году.
Пример
[ редактировать ]Обычно условный оператор записывается так:
if ( $value == 42 ) { /* ... */ } // Читается так: "Если значение равно 42..."
Условия Йоды описывают то же выражение, но в обратном порядке:
if ( 42 == $value ) { /* ... */ } // Читается так: «Если 42 равно значению...»
Преимущество
[ редактировать ]Читабельность логически связанных сравнений
[ редактировать ]Некоторые языки, такие как Python , поддерживают в своем синтаксисе «связанные» операторы сравнения («компараторы»). [7] Таким образом, следующие строки логически эквивалентны:
# Использование связанных компараторов: if 3.14 < y <= 42 : ... # Логически эквивалентно: if ( 3.14 < y ) и ( y <= 42 ): ...
Обратите внимание, что вторая форма естественным образом использует синтаксис Yoda для левого сравнения ( 3.14 < y
). Рассмотрим ту же строку без синтаксиса Йоды:
если ( y > 3,14 ) и ( y <= 42 ): ...
При рукописном написании математики многие авторы предпочитают «цепочную» запись ( пример , пример ). При программировании на языке, который буквально не поддерживает цепную нотацию, автор может предпочесть синтаксис Yoda, поскольку он, по крайней мере, визуально напоминает знакомую цепную нотацию.
Обнаружение ошибок
[ редактировать ]Размещение постоянного значения в выражении не меняет поведение программы ( если значения не оцениваются как ложные — см. ниже). В языках программирования, использующих один знак равенства ( =
) для выражений присваивания , а не для сравнения, возможной ошибкой является непреднамеренное присвоение значения вместо написания условного оператора.
if ( myNumber = 42 ) { /* ... */ } // Это присваивает myNumber 42 вместо оценки желаемого условия
Используя условия Йоды:
if ( 42 = myNumber ) { /* ... */ } // Это синтаксическая ошибка, и компилировать ее не получится
Поскольку 42 — константа может быть изменена, эта ошибка будет перехвачена компилятором и не .
Логическое значение myBoolean = null ; if ( myBoolean == true ) { /* ... */ } // Это вызывает исключение NullPointerException во время выполнения Java, но допустимо при компиляции. // Это происходит потому, что Java попытается вызвать myBoolean.booleanValue() для нулевого объекта.
Как избежать некоторых типов небезопасного нулевого поведения
[ редактировать ]Условия Йоды помогают при небезопасном поведении в некоторых ситуациях.
Строка myString = ноль ; if ( myString . equals ( "foobar" )) { /* ... */ } // Это вызывает исключение NullPointerException в Java
С условиями Йоды:
Строка myString = ноль ; if ( "foobar" . Equals ( myString )) { /* ... */ } // Это разрешается как false без создания исключения NullPointerException
Критика
[ редактировать ]Условия Йоды критикуются за ухудшение читаемости из-за увеличения когнитивной нагрузки при чтении кода. [8] [9] [10]
Некоторые языки программирования (такие как Swift , Kotlin и версии Python ниже 3.8) не допускают присваивания переменных внутри условных операторов — например, требуя, чтобы присваивания не возвращали значение, или определяя как часть своей грамматики инвариант, который условия не могут содержать. операторы присваивания — в этом случае эту ошибку невозможно встретить (то есть она будет обнаружена как синтаксическая ошибка синтаксическим анализатором до того, как программе будет разрешено войти в среду выполнения ). [11] Многие компиляторы выдают предупреждение для такого кода, как if (myNumber = 42)
(например, GCC -Wall
опция предупреждает , предлагает использовать круглые скобки вокруг присваивания, используемого в качестве истинностного значения ), что предупреждает программиста о вероятной ошибке. В динамических языках, таких как JavaScript , линтеры, такие как ESLint, могут предупреждать о присваивании внутри условия. [12] В Python 3.8 появились выражения присваивания, но используется оператор моржа. :=
вместо обычного знака равенства (=), чтобы избежать ошибок, которые просто запутывают ==
с =
. [13]
Преимущество предотвращения нулевого поведения также можно считать недостатком, поскольку ошибки нулевого указателя могут быть скрыты и появляться в программе гораздо позже.
Еще один недостаток возникает в C++ при сравнении небазовых типов, поскольку == является оператором и может не быть определена подходящая перегруженная операторная функция. Пример: Microsoft CComBSTR
сравнить со строковым литералом , записанным как if (L"Hello" == cbstrMessage)
, не соответствует функции перегрузки. [14]
Ссылки
[ редактировать ]- ^ «Стандарты кодирования (вклад в Symfony)» . Symfony.com . Проверено 12 ноября 2016 г. .
- ^ «Стандарты кодирования PHP | Справочник по стандартам кодирования» . Ресурсы для разработчиков WordPress . Проверено 25 июля 2021 г.
- ^ Пуллум, Джеффри К. (18 мая 2005 г.). «Синтаксис Йоды анализируется Tribune; предоставлю более подробную информацию!» . Itre.cis.upenn.edu . Языковой журнал . Проверено 22 декабря 2014 г.
Один из способов взглянуть на синтаксис Йоды состоит в том, что он демонстрирует признаки предпочтения синтаксиса OSV (Объект-Субъект-Глагол) в качестве основного порядка в простом предложении.
- ^ «The StarWars.com 10: Лучшие цитаты Йоды» . starwars.com . Лукасфильм, ООО, 26 ноября 2013 г. Проверено 22 декабря 2014 г.
Когда тебе исполнится девятьсот лет, выглядеть так хорошо ты уже не будешь.
- ^ «Цитаты Йоды (Персонажа)» . imdb.com . Амазонка . Проверено 22 декабря 2014 г.
Когда *тебе* исполнится девятьсот лет, выглядеть так хорошо *ты* уже не будешь, хм?
- ^ «Нотация Йоды (также известная как условие Йоды) — происхождение термина» . 17 апреля 2013 года . Проверено 26 декабря 2020 г.
- ^ «Сравнения» . Справочник по библиотеке Python . Фонд программного обеспечения Python. 2008.
- ^ Париж, Грегуар (24 января 2020 г.). «Почему использовать условия Йоды вам, вероятно, не следует» . Сообщество разработчиков . Проверено 30 января 2022 г.
- ^ Классик, Майк (16 августа 2017 г.). «Состояния Йоды: почему их не следует использовать» . mikeclassic.ca . Проверено 30 января 2022 г.
- ^ Контьери, Макси (7 февраля 2023 г.). «Код Запах 195 — Условия Йоды» . Максимилиано Контьери — Разработка программного обеспечения . Проверено 22 мая 2024 г.
- ^ «Базовые операторы — язык программирования Swift (Swift 5.6)» . docs.swift.org . Яблоко . Проверено 30 января 2022 г.
- ^ «запретить операторы присваивания в условных операторах» . eslint.org . Проверено 29 января 2022 г.
- ^ Анджелико, Крис; Питерс, Тим; ван Россум, Гвидо (28 февраля 2018 г.). «PEP 572 — Выражения присваивания» . Python.org . Проверено 18 июля 2021 г.
- ^ «Класс CComBSTR» . docs.microsoft.com . Майкрософт. 3 августа 2021 г. Проверено 30 января 2022 г.
Внешние ссылки
[ редактировать ]- united-coders.com: Что такое условия Йоды? Примеры на Java
- Условия Йоды кажутся очень вредными. Критика этой техники, утверждающая, что она может принести больше вреда, чем пользы.