mcpField
C
cyclomatic-complexity

cyclomatic-complexity

github.com/saurabhkumar8112開発40886 回インストール9 週間前に更新
リポジトリ

cyclomatic-complexity について

cyclomatic-complexityは、コードの複雑度を測定・低減するスキルです。コードを作成・保守するエージェント向けに、しきい値やリファクタリング手順を定め、変更前後の動作と複雑度を確認します。

主な機能

  1. 01関数の複雑度を測定・順位付け
  2. 02プロジェクトまたは既定のしきい値を適用
  3. 03分岐やネストのリファクタリング方針
  4. 04変更前後のテスト実行
  5. 05複雑度の前後比較を報告

活用シーン

  1. 01複雑度の高い関数を特定
  2. 02分岐が増えたコードをリファクタリング
  3. 03AI生成コードの保守性を確認
  4. 04変更後の動作と指標を検証

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/saurabhkumar8112/cyclomatic-complexity-skill --skill cyclomatic-complexity

インストール後、Claude Code で/cyclomatic-complexityを入力して読み込まれたか確認します。

詳細

循環的複雑度

目的:AI が書いたコードは動作することが多いものの、分岐がジャングルのように入り組みがちです。このスキルでは、複雑度を測定し、複雑な箇所をリファクタリングして、人が保守しやすいコードを維持します。

まず測定する

CC = 判定ポイント + 1。判定ポイントは、条件式内の if、else if、case、ループ、catch、三項演算子、&&、|| です。

プロジェクトのリンター設定を優先します。eslintrc、radon の設定、sonar の設定、または同様の設定で複雑度のしきい値が指定されている場合は、それを使用します。設定がない場合は、以下のデフォルト値を使用します。

しきい値:

  • 1-5:問題ありません。そのままにします
  • 6-10:注意が必要です。ほかの変更で触る場合はリファクタリングします
  • 11-15:すぐにリファクタリングします
  • 15+:必ず分割します。議論の余地はありません

環境が許す場合は、目視で判断するより実際のツールを優先します:

  • Python:radon cc -s -a <path>
  • JS/TS:eslint の complexity ルール
  • Go:gocyclo
  • 複数言語:lizard <path>

ツールが使えない場合は、関数ごとに手作業で数え、数値を示します。

リファクタリングの手法(優先順)

  1. ガード節。 条件を反転し、早期に return して、ネストをなくします。
  2. 関数の抽出。 抽出した各部分には、方法ではなく内容を表す名前を付けます。名前はドキュメントです。
  3. if-else や switch の連鎖の代わりに、ルックアップテーブル/マップを使用します。
  4. 名前付き述語。 if (isEligibleForRefund(order)) は、4 条件のブール値の寄せ集めより優れています。
  5. 型による switch にはポリモーフィズム/ストラテジーを使います。ただし、その switch が 2 か所以上にある場合に限ります。
  6. ループをフラット化します。 ループ本体を抽出し、ネストした if の代わりに continue を使用します。

厳守事項

  • 動作を維持します。変更前と変更後にテストを実行します。テストがない場合は、その旨を伝えて追加を提案し、慎重にリファクタリングします。
  • 指標をごまかしてはいけません。6 つの分岐を隠した密なワンライナーは、置き換える前の素直な if の連鎖より悪いものです。複雑度は、巧妙な書き方で消すのではなく、適切な名前を付けた単位に移します。
  • 確認を求めずに、公開 API やエクスポートされたシグネチャを変更してはいけません。
  • セクションを説明するコメントを付けた少数の関数より、明確な名前を持つ小さな関数を優先します。
  • 関数の責務は 1 つにします。名前に「and」が必要なら、分割します。

ワークフロー

  1. 変更するすべての関数を測定し、CC の降順に並べます。
  2. 変更に着手する前に、数値とともに複雑な箇所を報告します。
  3. 最も複雑なものから、一度に 1 つずつリファクタリングします。
  4. 再測定します。変更前後の表を示します:関数、変更前の CC、変更後の CC。
  5. 検証します:テストに合格すること、動作が変わらないこと、差分をレビューできること。

出力形式

各リファクタリングの最後に、次を記載します:

## Complexity report
| Function | Before | After |
|----------|--------|-------|
| parseOrder | 14 | 4 |

Extracted: validateHeader, resolveDiscount
Behavior verified: <how>

説明は最小限にします。数値と差分で伝えます。

コメント