Skip to content
← Back to rules

eslint/complexity 限制

它的作用

强制执行程序中的最大循环复杂度,即程序中线性独立路径的数量。

为什么这是不好的?

高代码复杂度会降低代码的可读性。此规则通过减少程序中的分支数量,使代码更易于理解。

示例

以下是在 { "max": 2 } 配置下的 错误 代码示例:

js
function foo() {
  if (foo1) {
    return x1; // 第 1 条路径
  } else if (foo2) {
    return x2; // 第 2 条路径
  } else {
    return x3; // 第 3 条路径
  }
}

function bar() {
  // 有 2 条路径——当 bar1 为假值时,以及当 bar1 为真值时,此时 bar1 = bar1 && bar2;
  bar1 &&= bar2;
  // 有 2 条路径——当 bar3 为真值时,以及当 bar3 为假值时,此时 bar3 = 4;
  bar3 ||= 4;
}

// 有 2 条路径——当 baz1 有定义时,以及当 baz1 未定义并被赋值为 'a' 时
function baz(baz1 = "a") {
  const { baz2 = "b" } = baz3; // 有 2 条额外路径——当 baz2 有定义时,以及当 baz2 不存在时
}

function d() {
  d1 = d2?.d3?.(); // 可选链操作符每处创建 2 条路径——当对象有定义时和当对象无定义时
}

以下是在 { "max": 2 } 配置下的 正确 代码示例:

js
// 此示例直接取自 ESLint 文档
function foo() {
  // 此函数的复杂度 = 1
  class C {
    x = a + b; // 此初始化器的复杂度 = 1
    y = c || d; // 此初始化器的复杂度 = 2
    z = e && f; // 此初始化器的复杂度 = 2

    static p = g || h; // 此初始化器的复杂度 = 2
    static q = i ? j : k; // 此初始化器的复杂度 = 2

    static {
      // 此静态块的复杂度 = 2
      if (foo) {
        baz = bar;
      }
    }

    static {
      // 此静态块的复杂度 = 2
      qux = baz || quux;
    }
  }
}

配置

此规则接受一个配置对象,包含以下属性:

max

type: integer

default: 20

最大循环复杂度

variant

type: "classic" | "modified"

default: "classic"

要使用的循环复杂度变体

"classic"

经典模式指麦凯布(McCabe)循环复杂度

"modified"

修改版指经典的循环复杂度,但无论 case 语句数量多少,switch 语句都会使复杂度增加 1

如何使用

通过配置文件或 CLI 启用此规则的方法如下:

json
{
  "rules": {
    "complexity": "error"
  }
}
bash
oxlint --deny complexity

参考资料