Jump to content

Условия Йоды

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

Условия Йоды являются частью стандартов кодирования 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]

  1. ^ «Стандарты кодирования (вклад в Symfony)» . Symfony.com . Проверено 12 ноября 2016 г. .
  2. ^ «Стандарты кодирования PHP | Справочник по стандартам кодирования» . Ресурсы для разработчиков WordPress . Проверено 25 июля 2021 г.
  3. ^ Пуллум, Джеффри К. (18 мая 2005 г.). «Синтаксис Йоды анализируется Tribune; предоставлю более подробную информацию!» . Itre.cis.upenn.edu . Языковой журнал . Проверено 22 декабря 2014 г. Один из способов взглянуть на синтаксис Йоды состоит в том, что он демонстрирует признаки предпочтения синтаксиса OSV (Объект-Субъект-Глагол) в качестве основного порядка в простом предложении.
  4. ^ «The StarWars.com 10: Лучшие цитаты Йоды» . starwars.com . Лукасфильм, ООО, 26 ноября 2013 г. Проверено 22 декабря 2014 г. Когда тебе исполнится девятьсот лет, выглядеть так хорошо ты уже не будешь.
  5. ^ «Цитаты Йоды (Персонажа)» . imdb.com . Амазонка . Проверено 22 декабря 2014 г. Когда *тебе* исполнится девятьсот лет, выглядеть так хорошо *ты* уже не будешь, хм?
  6. ^ «Нотация Йоды (также известная как условие Йоды) — происхождение термина» . 17 апреля 2013 года . Проверено 26 декабря 2020 г.
  7. ^ «Сравнения» . Справочник по библиотеке Python . Фонд программного обеспечения Python. 2008.
  8. ^ Париж, Грегуар (24 января 2020 г.). «Почему использовать условия Йоды вам, вероятно, не следует» . Сообщество разработчиков . Проверено 30 января 2022 г.
  9. ^ Классик, Майк (16 августа 2017 г.). «Состояния Йоды: почему их не следует использовать» . mikeclassic.ca . Проверено 30 января 2022 г.
  10. ^ Контьери, Макси (7 февраля 2023 г.). «Код Запах 195 — Условия Йоды» . Максимилиано Контьери — Разработка программного обеспечения . Проверено 22 мая 2024 г.
  11. ^ «Базовые операторы — язык программирования Swift (Swift 5.6)» . docs.swift.org . Яблоко . Проверено 30 января 2022 г.
  12. ^ «запретить операторы присваивания в условных операторах» . eslint.org . Проверено 29 января 2022 г.
  13. ^ Анджелико, Крис; Питерс, Тим; ван Россум, Гвидо (28 февраля 2018 г.). «PEP 572 — Выражения присваивания» . Python.org . Проверено 18 июля 2021 г.
  14. ^ «Класс CComBSTR» . docs.microsoft.com . Майкрософт. 3 августа 2021 г. Проверено 30 января 2022 г.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: d803f88a2679580f529411668340f0dc__1716375720
URL1:https://arc.ask3.ru/arc/aa/d8/dc/d803f88a2679580f529411668340f0dc.html
Заголовок, (Title) документа по адресу, URL1:
Yoda conditions - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)