Spec-Zone.ru › ESLint

yoda

Требовать или запрещать условия «Йоды»

🔧 Можно исправить

Некоторые проблемы, о которых сообщает это правило, можно автоматически исправить с помощью параметра командной строки --fix

❄️ Заморожено

В настоящее время это правило заморожено, и запросы на добавление функций не принимаются.

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

if ("red" === color) {
    // ...
}

Это называется условием Йоды, потому что его можно прочитать как «если красный равен цвету» — подобно тому, как говорит персонаж «Звёздных войн» Йода. Сравните с другим порядком операндов:

if (color === "red") {
    // ...
}

Обычно это читается как «если цвет равен красному», что, пожалуй, является более естественным способом описать сравнение.

Сторонники условий Йоды отмечают, что невозможно случайно использовать = вместо ==, поскольку нельзя присвоить значение литералу. Это вызовет синтаксическую ошибку, и вы сразу узнаете о ней. Поэтому такая практика была очень распространена на заре программирования, когда подходящие инструменты ещё не были доступны.

Противники условий Йоды указывают на то, что инструменты сделали нас лучшими программистами: они обнаружат ошибочное использование = вместо == (ESLint сделает это за вас). Поэтому, утверждают они, польза этого шаблона не компенсирует ухудшение читаемости кода при использовании условий Йоды.

Подробное описание правила

Это правило призвано обеспечить единообразный стиль условий, в которых переменная сравнивается с литеральным значением.

Параметры

Правило может принимать строковый параметр:

  • Если используется значение по умолчанию "never", сравнения не должны быть условиями Йоды.
  • Если используется "always", литеральное значение должно всегда указываться первым.

Для параметра по умолчанию "never" можно задать исключения в объектном литерале:

  • Если свойство "exceptRange" имеет значение true, правило разрешает условия Йоды в сравнениях диапазонов, непосредственно заключённых в скобки, включая скобки условия if или while. Значение по умолчанию — false. Сравнение диапазона проверяет, находится ли переменная внутри или за пределами диапазона между двумя литеральными значениями.
  • Если свойство "onlyEquality" имеет значение true, правило сообщает об условиях Йоды только для операторов равенства == и ===. Значение по умолчанию — false.

Параметр onlyEquality допускает все исключения, разрешённые параметром exceptRange, а также дополнительные, поэтому использовать оба параметра одновременно нет смысла.

never

Примеры неправильного кода для параметра по умолчанию "never":

Открыть в Playground
/*eslint yoda: "error"*/

if ("red" === color) {
    // ...
}

if (`red` === color) {
    // ...
}

if (`red` === `${color}`) {
    // ...
}

if (true == flag) {
    // ...
}

if (5 > count) {
    // ...
}

if (-1 < str.indexOf(substr)) {
    // ...
}

if (0 <= x && x < 1) {
    // ...
}

Примеры правильного кода для параметра по умолчанию "never":

Открыть в Playground
/*eslint yoda: "error"*/

if (5 & value) {
    // ...
}

if (value === "red") {
    // ...
}

if (value === `red`) {
    // ...
}

if (`${value}` === `red`) {

}

exceptRange

Примеры правильного кода для параметров "never", { "exceptRange": true }:

Открыть в Playground
/*eslint yoda: ["error", "never", { "exceptRange": true }]*/

function isReddish(color) {
    return (color.hue < 60 || 300 < color.hue);
}

if (x < -1 || 1 < x) {
    // ...
}

if (count < 10 && (0 <= rand && rand < 1)) {
    // ...
}

if (`blue` < x && x < `green`) {
    // ...
}

function howLong(arr) {
    return (0 <= arr.length && arr.length < 10) ? "short" : "long";
}

onlyEquality

Примеры правильного кода для параметров "never", { "onlyEquality": true }:

Открыть в Playground
/*eslint yoda: ["error", "never", { "onlyEquality": true }]*/

if (x < -1 || 9 < x) {
}

if (x !== 'foo' && 'bar' != x) {
}

if (x !== `foo` && `bar` != x) {
}

always

Примеры неправильного кода для параметра "always":

Открыть в Playground
/*eslint yoda: ["error", "always"]*/

if (color == "blue") {
    // ...
}

if (color == `blue`) {
    // ...
}

Примеры правильного кода для параметра "always":

Открыть в Playground
/*eslint yoda: ["error", "always"]*/

if ("blue" == value) {
    // ...
}

if (`blue` == value) {
    // ...
}

if (`blue` == `${value}`) {
    // ...
}

if (-1 < str.indexOf(substr)) {
    // ...
}

Версия

Это правило добавлено в ESLint v0.7.1.

Дополнительная литература

Условия Йоды — Википедия
en.wikipedia.org
Программирование со стилем
thomas.tuerke.net

Ресурсы

  • Исходный код правила
  • Исходный код тестов

© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/yoda

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API