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 が定義されているときと、定義されていないとき
}

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"

クラシックとは、マクケーブの循環複雑度を指します。

"modified"

修正版とは、クラシックの循環複雑度をベースに、スイッチ文が case 文の数に関係なく複雑度を1増やすことを意味します。

使用方法

設定ファイルまたは CLI を使ってこのルールを 有効化 するには、次のようにします:

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

参照