メインコンテンツへ移動
AIチュートリアル

Claudeで循環的複雑度を削減する

cyclomatic-complexity Claudeスキルのインストールと使い方を学び、関数の複雑度を測定し、問題箇所に優先順位を付け、安全にリファクタリングを行い、指標をごまかさずに変更前後の明確なレポートを作成する方法を解説します。

Claudeで循環的複雑度を削減する

サイクロマティック複雑度スキルとは?

cyclomatic-complexityは、既存コードの過剰な分岐を減らすために設計されたClaudeスキルです。正しく動作するものの、深くネストされた条件分岐、数多くの判断経路、または人間が保守しにくい関数が蓄積されたAI生成コードに特に役立ちます。

このスキルは、関数ごとの複雑度を測定し、最も問題のあるホットスポットを特定してリファクタリングし、動作を検証したうえで、変更前後の複雑度の値とともに結果をまとめるという、体系的なプロセスをClaudeに案内します。

圧縮された式や巧妙なワンライナーでスコアを最適化するのではなく、このスキルは判断ロジックを、明確で適切な名前を持つ関数へ移します。目的は、複雑度の測定値を下げることだけでなく、保守性を高めることです。

主な機能

  • 関数単位の測定:Radon、ESLint、gocyclo、Lizard、または手動カウントで複雑度を測定できます。
  • プロジェクトを考慮したしきい値:プロジェクトのリンターにすでに設定されている複雑度の上限を尊重します。
  • ホットスポットの優先順位付け:コードを無差別に変更するのではなく、最も複雑な関数からリファクタリングします。
  • 確立されたリファクタリングパターン:ガード節、関数の抽出、ルックアップテーブル、名前付き述語を使用します。
  • 指標のごまかしなし:複雑度を密集した構文に隠すのではなく、理解しやすい単位に再編成します。
  • 明確なレポート:すべてのリファクタリングの最後に、変更前後の複雑度レポートを提示します。

インストール

Claude Codeにインストールする

プロジェクトのプラグインマーケットプレイスを追加してから、スキルをインストールします。

/plugin marketplace add saurabhkumar8112/cyclomatic-complexity-skill
/plugin install cyclomatic-complexity@cyclomatic-complexity-skill

インストール後、Claude Codeは関連するリファクタリング、クリーンアップ、コードレビューの依頼に対して、このスキルを有効化できます。

Claude.aiにインストールする

  1. リポジトリのReleasesセクションを開き、.skillファイルをダウンロードします。別の方法として、skills/cyclomatic-complexityフォルダーのZIPアーカイブを作成することもできます。
  2. Claude.aiを開き、Settings、Capabilities、Skillsの順に移動します。
  3. ダウンロードしたスキルファイルまたはZIPアーカイブをアップロードします。

Claude APIでインストールする

APIベースのワークフローでは、Claude Skills APIを通じてスキルをアップロードします。現在のアップロードおよび設定手順については、APIガイドに従ってください。

基本的な使い方

依頼がリファクタリング、クリーンアップ、またはコードレビューに関するものであれば、このスキルは自動的に起動します。より細かく制御するには、スキル名を明示し、Claudeに調査させるファイルを指定します。

cyclomatic complexityスキルを使ってparser.pyをリファクタリングしてください

この直接的な依頼により、目的のワークフローと対象ファイルの両方が明確になります。その後Claudeは複雑度を測定し、最も問題のある関数を特定して、適切なリファクタリングパターンを適用できます。

対象を絞ったコードレビューを依頼する

複雑度に焦点を当てたレビューとしてタスクを依頼することもできます。

cyclomatic complexityスキルを使ってparser.pyをレビューしてください。関数ごとの複雑度を測定し、最も問題のあるホットスポットからリファクタリングしてください。

プロジェクトですでにリンターのしきい値を定義している場合は、スキルが既存の基準を尊重できるよう、その設定をリポジトリ内で利用できる状態にしておきます。

リファクタリングプロセスを理解する

  1. 各関数を測定する:Radon、ESLint、gocyclo、Lizardなど、対応している適切な解析ツールを使用します。手動カウントも利用できます。
  2. プロジェクトのしきい値を確認する:既存のリンター上限が設定されている場合は、それが優先されます。
  3. ホットスポットを順位付けする:複雑度が最も高い関数から対応します。
  4. 読みやすい変換を適用する:必要に応じて、ガード節の導入、関数の抽出、ルックアップテーブルの作成、複雑な述語への名前付けを行います。
  5. 動作を検証する:リファクタリング後も既存の動作を維持し、利用可能なテストスイートで検証します。
  6. 結果を報告する:最終回答に、変更前後の複雑度を示します。

出力の読み方

リファクタリングが完了すると、次のようなレポートが含まれます。

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

Extracted: validateHeader, resolveDiscount
Behavior verified: existing test suite passes

この例では、parseOrderの複雑度が14から4に下がっています。レポートには、抽出された関数validateHeaderとresolveDiscountの名前も示され、既存のテストが成功したことも記録されています。

抽出した関数の一覧が重要なのは、数値が下がっただけではコードが保守しやすくなったことを証明できないためです。明確な名前によって責務の移動先が示され、レビュー担当者が新しい構造を理解しやすくなります。

このスキルで使用するリファクタリング手法

ガード節

ガード節は、無効な条件や例外的な条件を早い段階で処理します。これによりネストを減らし、主要な実行経路を追いやすくできます。

関数の抽出

1つの関数が複数の判断や責務を担っている場合、このスキルはまとまりのある処理を、適切な名前を持つ関数へ移すことができます。これにより、意図を伝える単位へ複雑度を分散できます。

ルックアップテーブル

既知の入力を既知の結果に対応付ける分岐の繰り返しは、ルックアップテーブルに置き換えられる場合があります。このスキルでは、単にコードを短くするのではなく、明確さが向上する場合にこの手法を使用します。

名前付き述語

複雑な条件は、ビジネスルールを説明する名前を持つ関数に配置できます。これにより、判断箇所が読みやすくなり、不透明な条件式を避けられます。

高度なヒント

対象を絞って始める

大規模なコードベースでは、1つのファイルまたは問題が明らかな領域から始めます。refactor parser.py のように対象を絞った指示を出すと、スキルの範囲が明確になり、生成されたレポートもレビューしやすくなります。

リンター設定を利用できる状態にする

プロジェクト独自の複雑度のしきい値がある場合は、Claudeがタスクを実行する際に関連する設定が存在することを確認してください。このスキルは、無関係な基準を押し付けるのではなく、プロジェクトで定義された制限に従うよう設計されています。

最も問題の大きい箇所から依頼する

複雑度が最も高い関数を優先すると、保守性への効果が最も大きい箇所に取り組めます。また、すでに単純な関数に不要な変更を加えることも避けられます。

スコアだけでなく名前も確認する

最終的な数値に加えて、抽出された関数や述語の名前も確認してください。validateHeader や resolveDiscount のような名前は責任範囲を説明します。測定スコアが下がったとしても、曖昧なヘルパー名ではリファクタリングの価値が低下します。

テストを安全性の確認に使う

複雑度の削減によって動作が変わってはいけません。既存のテストスイートを利用できる状態にし、最終レポートにテストの合否が記録されていることを確認してください。複雑度のスコアを改善するために、正確性を犠牲にしてはいけません。

指標の不正操作を促す依頼を避ける

可能な限り小さいスコアではなく、読みやすく保守しやすい変更を依頼してください。このスキルは、巧妙なワンライナーに判断処理を隠すことを明確に避けています。そのため、プロンプトでも明確さと長期的な保守性を重視するようにしてください。

まとめ

サイクロマティック複雑度スキルは、分岐の多いコードを改善するための再現可能なワークフローをClaudeに提供します。複雑度を測定し、プロジェクトのしきい値に従い、最も問題の大きい関数から着手し、読みやすいリファクタリングパターンを適用して、動作を検証し、変更前後の具体的なレポートで完了します。このプロジェクトはApache 2.0ライセンスの下で配布されています。