cyclomatic-complexity について
cyclomatic-complexityは、コードの複雑度を測定・低減するスキルです。コードを作成・保守するエージェント向けに、しきい値やリファクタリング手順を定め、変更前後の動作と複雑度を確認します。
主な機能
- 01関数の複雑度を測定・順位付け
- 02プロジェクトまたは既定のしきい値を適用
- 03分岐やネストのリファクタリング方針
- 04変更前後のテスト実行
- 05複雑度の前後比較を報告
活用シーン
- 01複雑度の高い関数を特定
- 02分岐が増えたコードをリファクタリング
- 03AI生成コードの保守性を確認
- 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>
ツールが使えない場合は、関数ごとに手作業で数え、数値を示します。
リファクタリングの手法(優先順)
- ガード節。 条件を反転し、早期に return して、ネストをなくします。
- 関数の抽出。 抽出した各部分には、方法ではなく内容を表す名前を付けます。名前はドキュメントです。
- if-else や switch の連鎖の代わりに、ルックアップテーブル/マップを使用します。
- 名前付き述語。
if (isEligibleForRefund(order))は、4 条件のブール値の寄せ集めより優れています。 - 型による switch にはポリモーフィズム/ストラテジーを使います。ただし、その switch が 2 か所以上にある場合に限ります。
- ループをフラット化します。 ループ本体を抽出し、ネストした if の代わりに continue を使用します。
厳守事項
- 動作を維持します。変更前と変更後にテストを実行します。テストがない場合は、その旨を伝えて追加を提案し、慎重にリファクタリングします。
- 指標をごまかしてはいけません。6 つの分岐を隠した密なワンライナーは、置き換える前の素直な if の連鎖より悪いものです。複雑度は、巧妙な書き方で消すのではなく、適切な名前を付けた単位に移します。
- 確認を求めずに、公開 API やエクスポートされたシグネチャを変更してはいけません。
- セクションを説明するコメントを付けた少数の関数より、明確な名前を持つ小さな関数を優先します。
- 関数の責務は 1 つにします。名前に「and」が必要なら、分割します。
ワークフロー
- 変更するすべての関数を測定し、CC の降順に並べます。
- 変更に着手する前に、数値とともに複雑な箇所を報告します。
- 最も複雑なものから、一度に 1 つずつリファクタリングします。
- 再測定します。変更前後の表を示します:関数、変更前の CC、変更後の CC。
- 検証します:テストに合格すること、動作が変わらないこと、差分をレビューできること。
出力形式
各リファクタリングの最後に、次を記載します:
## Complexity report
| Function | Before | After |
|----------|--------|-------|
| parseOrder | 14 | 4 |
Extracted: validateHeader, resolveDiscount
Behavior verified: <how>
説明は最小限にします。数値と差分で伝えます。
コメント
Markdown 対応