Spec-Zone.ru › ESLint

Йода

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

🔧 Исправимые

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

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

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

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

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

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

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

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

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

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

Параметры

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

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

Параметр по умолчанию "never" может иметь параметры исключений в объектной литеральной форме:

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

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

never

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

Открыть в игровой площадке
/*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":

Открыть в игровой площадке
/*eslint yoda: "error"*/

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

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

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

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

}

exceptRange

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

Открыть в игровой площадке
/*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 }:

Открыть в игровой площадке
/*eslint yoda: ["error", "never", { "onlyEquality": true }]*/

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

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

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

always

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

Открыть в игровой площадке
/*eslint yoda: ["error", "always"]*/

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

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

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

Открыть в игровой площадке
/*eslint yoda: ["error", "always"]*/

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

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

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

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

Версия

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

Дополнительные материалы

Условия «Йода» - Википедия
Стиль кодирования

Ресурсы

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

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

Spec-Zone.ru

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