Spec-Zone.ru › ESLint

сложность

Навязывает максимальную цикломатическую сложность, разрешенную в программе

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

function a(x) {
    if (true) {
        return x; // 1st path
    } else if (false) {
        return x+1; // 2nd path
    } else {
        return 4; // 3rd path
    }
}

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

Это правило направлено на снижение сложности кода, ограничивая количество цикломатической сложности, разрешенной в программе. Таким образом, оно будет предупреждать, когда цикломатическая сложность превысит настроенный порог (по умолчанию 20).

Примеры неправильного кода для максимального значения 2:

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

functiona(x){if(true){return x;}elseif(false){return x+1;}else{return4;// 3rd path}}

functionb(){    foo ||=1;    bar &&=1;}

functionc(a = {}){// default parameter -> 2nd pathconst{ b ='default'}= a;// default value during destructuring -> 3rd path}

functiond(a){return a?.b?.c;// optional chaining with two optional properties creates two additional branches}

Примеры правильного кода для максимального значения 2:

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

function a(x) {
    if (true) {
        return x;
    } else {
        return 4;
    }
}

function b() {
    foo ||= 1;
}

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

Примеры дополнительного неправильного кода для максимального значения 2:

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

class C {
    x = a || b || c; // this initializer has complexity = 3
}

class D { // this static block has complexity = 3
    static{if(foo){            bar = baz || qux;}}
}

Примеры дополнительного правильного кода для максимального значения 2:

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

function foo() { // this function has complexity = 1
    class C {
        x = a + b; // this initializer has complexity = 1
        y = c || d; // this initializer has complexity = 2
        z = e && f; // this initializer has complexity = 2

        static p = g || h; // this initializer has complexity = 2
        static q = i ? j : k; // this initializer has complexity = 2

        static { // this static block has complexity = 2
            if (foo) {
                baz = bar;
            }
        }

        static { // this static block has complexity = 2
            qux = baz || quux;
        }
    }
}

Параметры

Это правило имеет параметр в виде числа или объекта:

  • "max" (по умолчанию 20) принудительно устанавливает максимальную сложность

  • "variant": "classic" | "modified" (по умолчанию "classic") используемая разновидность цикломатической сложности

max

Настройте порог с помощью свойства max.

"complexity": ["error", { "max": 2 }]

Устарело: свойство объекта maximum устарело. Используйте свойство max вместо него.

Или используйте сокращенную запись:

"complexity": ["error", 2]

variant

Разновидность цикломатической сложности для использования:

  • "classic" (по умолчанию) - классическая цикломатическая сложность МакКэбба
  • "modified" - модифицированная цикломатическая сложность

Модифицированная цикломатическая сложность такая же, как и классическая цикломатическая сложность, но каждое операторное утверждение switch увеличивает значение сложности только на 1, независимо от того, сколько операторных утверждений case оно содержит.

Примеры правильного кода для этого правила с параметром { "max": 3, "variant": "modified" }:

Открыть в Playground
/*eslint complexity: ["error", {"max": 3, "variant": "modified"}]*/

function a(x) {     // initial modified complexity is 1
    switch (x) {    // switch statement increases modified complexity by 1
        case 1:
            1;
            break;
        case 2:
            2;
            break;
        case 3:
            if (x === 'foo') {  // if block increases modified complexity by 1
                3;
            }
            break;
        default:
            4;
    }
}

Классическая цикломатическая сложность указанной выше функции составляет 5, а модифицированная цикломатическая сложность — только 3.

Когда не следует его использовать

Если вы не можете определить подходящий предел сложности для своего кода, лучше всего отключить это правило.

Связанные правила

  • max-depth
  • max-len
  • max-lines
  • max-lines-per-function
  • max-nested-callbacks
  • max-params
  • max-statements

Версия

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

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

Цикломатическая сложность - Википедия
Анализ сложности JavaScript-кода
Сложность для JavaScript
О сложности | JSComplexity.org
Сложность не имеет значения по умолчанию · Выпуск #4808 · eslint/eslint

Ссылки

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

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

Spec-Zone.ru

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