complexity
Ограничивает максимально допустимую цикломатическую сложность программы
Цикломатическая сложность измеряет количество линейно независимых путей в исходном коде программы. Это правило позволяет задать порог цикломатической сложности.
function a(x) {
if (true) {
return x; // 1st path
} else if (false) {
return x+1; // 2nd path
} else {
return 4; // 3rd path
}
}
Подробности правила
Это правило помогает уменьшить сложность кода, ограничивая максимально допустимую цикломатическую сложность программы. Поэтому оно будет выдавать предупреждение, если цикломатическая сложность превысит заданный порог (по умолчанию 20).
Примеры неправильного кода при максимальном значении 2:
/*eslint complexity: ["error", 2]*/
(x) {
if (true) {
return x;
} else if (false) {
return x+1;
} else {
return 4; // 3rd path
}
}
() {
foo ||= 1;
bar &&= 1;
}
(a = {}) { // default parameter -> 2nd path
const { b = 'default' } = a; // default value during destructuring -> 3rd path
}
(a) {
return a?.b?.c; // optional chaining with two optional properties creates two additional branches
}
Примеры правильного кода при максимальном значении 2:
/*eslint complexity: ["error", 2]*/
function a(x) {
if (true) {
return x;
} else {
return 4;
}
}
function b() {
foo ||= 1;
}
Инициализаторы полей класса и статические блоки класса являются неявными функциями. Поэтому их сложность вычисляется отдельно для каждого инициализатора и каждого статического блока и не учитывается в сложности окружающего кода.
Примеры дополнительного неправильного кода при максимальном значении 2:
/*eslint complexity: ["error", 2]*/
class C {
x = ; // this initializer has complexity = 3
}
class D { // this static block has complexity = 3
{
if (foo) {
bar = baz || qux;
}
}
}
Примеры дополнительного правильного кода при максимальном значении 2:
/*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" }:
/*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.
Когда не следует использовать это правило
Если вы не можете определить подходящий предел сложности для своего кода, лучше отключить это правило.
Связанные правила
Версия
Это правило появилось в ESLint v0.0.9.
Дополнительные материалы
Ресурсы
© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/complexity