ESLintのmax-nested-callbacksルール:ネストレベルを制限してスッキリコードを目指す


このルールは、コードの可読性と保守性を向上させるために役立ちます。ネストが深すぎると、コードが複雑になり、理解しにくくなります。また、デバッグも難しくなります。

max-nested-callbacks ルールでは、ネストレベルの最大値設定できます。デフォルトの値は 10 です。つまり、コールバック関数は最大で 10 層まで入れ子にすることができます。

この値を変更するには、ESLint の設定ファイルで max-nested-callbacks ルールを構成する必要があります。例:

{
  "rules": {
    "max-nested-callbacks": [
      "error",
      5
    ]
  }
}

上記の例では、ネストレベルの最大値を 5 に設定しています。つまり、コールバック関数は最大で 5 層まで入れ子にすることができます。

"max-nested-callbacks" ルールを構成する際の考慮事項

max-nested-callbacks ルールを構成する際は、以下の点に注意する必要があります。

  • コードの可読性と保守性
    常に、コードが読みやすく、保守しやすいことを優先してください。必要に応じて、ネストレベルを下げることを検討してください。
  • チームのコーディングスタイル
    チーム内で一貫したコーディングスタイルを維持することが重要です。他の開発者が設定している値を確認してください。
  • プロジェクトのコードベース
    プロジェクトのコードベースによっては、デフォルトの値である 10 で十分な場合があります。一方、より複雑なコードベースでは、値を下げる必要がある場合があります。

max-nested-callbacks ルール違反が発生した場合は、以下の方法で修正できます。

  • コードをリファクタリングする
    コードをリファクタリングすることで、より効率的でネストの少ないコードにすることができます。
  • 非同期処理を使用する
    コールバック関数を非同期処理に変換することで、ネストレベルを低減することができます。
  • コールバック関数を別の関数に 抽出 する: ネストレベルを深める代わりに、コールバック関数を別の関数に抽出することで、コードをより平坦にすることができます。


例 1

function foo(callback) {
  callback(function(innerCallback) {
    innerCallback(function() {
      // ...
    });
  });
}

このコードは、ネストレベルが 3 なので、max-nested-callbacks ルールに違反します。

修正

function foo(callback) {
  callback(function(innerCallback) {
    innerCallback(function() {
      // ...
    });
  });
}

function bar(callback) {
  callback();
}

foo(function(innerCallback) {
  bar(innerCallback);
});

上記の修正コードでは、コールバック関数を別の関数 bar に抽出することで、ネストレベルを 1 に減らしています。

例 2

async function foo() {
  const result1 = await callback1();
  const result2 = await callback2(result1);
  const result3 = await callback3(result2);
  // ...
}

このコードは、非同期処理を使用しているため、ネストレベルは 0 ですが、max-nested-callbacks ルールに違反します。

修正

async function foo() {
  const result1 = await callback1();
  const result2 = await callback2(result1);
  const result3 = await callback3(result2);
  // ...
}

上記の修正コードでは、max-nested-callbacks ルール違反を修正するために何もする必要はありません。

上記の例以外にも、max-nested-callbacks ルール違反が発生する可能性があります。コードをレビューして、ネストレベルが深すぎる箇所がないか確認してください。



** max-depth ルールを使用する

max-depth ルールは、コード全体のネストレベルを制限します。max-nested-callbacks ルールとは異なり、このルールはコールバック関数だけに適用されるわけではありません。

{
  "rules": {
    "max-depth": [
      "error",
      4
    ]
  }
}

上記の例では、コード全体のネストレベルの最大値を 4 に設定しています。つまり、関数やブロックのネストレベルが 4 を超えることはできません。

** max-lines ルールを使用する

max-lines ルールは、関数行数を制限します。長い関数は、ネストレベルが高くなる可能性が高いです。

{
  "rules": {
    "max-lines": [
      "error",
      50
    ]
  }
}

上記の例では、関数の最大行数を 50 に設定しています。つまり、関数は最大で 50 行までしか記述できません。

**3. ** コードレビューを行う

コードレビューは、コードの可読性と保守性を向上させるための効果的な方法です。コードレビューを行うことで、ネストレベルが深すぎる箇所を見つけ、改善することができます。

**4. ** 静的解析ツールを使用する

SonarQube や CodePro Analytix などの静的解析ツールを使用して、コードの複雑さを分析することができます。これらのツールは、ネストレベルが深すぎる箇所を特定するのに役立ちます。

max-nested-callbacks ルールは、コードの可読性と保守性を向上させるための有効な手段ですが、唯一の手段ではありません。上記の代替方法も検討して、プロジェクトに最適な方法を選択してください。

  • 静的解析ツールを使用して、コードの複雑さを分析することができます。
  • コードレビューは、コードの可読性と保守性を向上させるための効果的な方法です。
  • max-lines ルールは、関数の行数を制限します。
  • max-depth ルールは、コード全体のネストレベルを制限します。