refactor-method-complexity-reduce について
役割を絞ったヘルパーメソッドを抽出し、動作を維持しながらメソッドを簡素化するコーディングスキルです。テストの失敗数がゼロであることとコンパイル結果を確認し、認知的複雑度のしきい値も検証します。
主な機能
- 01認知的複雑度の要因を特定
- 02役割を絞ったヘルパーメソッドを抽出
- 03検証処理とエラー動作を維持
- 04テストとコンパイルの確認を要求
- 05目標とする複雑度のしきい値を確認
活用シーン
- 01長いメソッドの複雑度を下げる
- 02重複処理や型別処理を分離
- 03リファクタリング後の動作を検証
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ github/ awesome-copilot --skill refactor-method-complexity-reduceインストール後、Claude Code で/refactor-method-complexity-reduceを入力して読み込まれたか確認します。
詳細
認知複雑度を下げるためのメソッドのリファクタリング
目的
メソッド ${input:methodName} をリファクタリングし、ロジックを責務の絞られたヘルパーメソッドに抽出することで、その認知複雑度を ${input:complexityThreshold} 以下に下げます。
手順
-
現在のメソッドを分析する - 認知複雑度の原因を特定します:
- ネストされた条件文
- 複数の if-else または switch チェーン
- 繰り返されるコードブロック
- 条件を伴う複数のループ
- 複雑な真偽式
-
抽出の機会を特定する:
- 別のメソッドに抽出できるバリデーションロジック
- 繰り返される型固有またはケース固有の処理
- 複雑な変換や計算
- 複数回現れる共通パターン
-
責務の絞られたヘルパーメソッドを抽出する:
- 各ヘルパーは単一の明確な責務を持つべきです
- バリデーションを個別の
Validate*メソッドに抽出します - 型固有のロジックをハンドラーメソッドに抽出します
- 共通操作のためのユーティリティメソッドを作成します
- 適切なアクセスレベル(static、private、async)を使用します
-
メインメソッドを簡素化する:
- ネストの深さを減らします
- 巨大な if-else チェーンを、より小さな呼び出しの組み合わせに置き換えます
- よりクリーンなディスパッチのために、適切な場所で switch 文を使用します
- メインメソッドが高レベルのフローとして読めるようにします
-
機能を保持する:
- 同じ入力/出力の挙動を維持します
- すべてのバリデーションとエラー処理を保持します
- 例外の種類とエラーメッセージを保持します
- すべてのパラメーターがヘルパーに適切に渡されるようにします
-
ベストプラクティス:
- インスタンスの状態を必要としないヘルパーメソッドは static にします
- null チェックとガード句を早い段階で使用します
- 不要なローカル変数の作成を避けます
- 複数の戻り値にはタプルの使用を検討します
- 関連するヘルパーメソッドをまとめて配置します
実装のアプローチ
- メインフローをリファクタリングする前にヘルパーメソッドを抽出します
- デグレードがないことを確認するために、インクリメンタルにテストします
- 抽出した責務を表す意味のある名前を使用します
- 抽出したメソッドは使用される場所の近くに配置します
- 繰り返されるコードパターンを汎用メソッドにすることを検討します
結果
リファクタリング後のメソッドは次のようになるべきです:
- 認知複雑度が目標しきい値
${input:complexityThreshold}以下に低減されている - より読みやすく、保守しやすい
- 関心の分離が明確である
- テストとデバッグがより容易である
- 元のすべての機能を保持している
テストと検証
重要: リファクタリングを完了した後、あなたは必ず以下を行わなければなりません:
- 既存のすべてのテストを実行する - リファクタリングしたメソッドとその周辺機能に関連するテスト
- 必須: テスト結果が「failed=0」を示していることを明示的に検証する
- テストが合格したと決して仮定しないでください - 常に実際のテスト出力を確認してください
- 合格/不合格の件数を含むサマリー行(例: 「passed=X failed=Y」)を検索してください
- サマリーが「failed=0」以外の数値を示している場合、テストは失敗しています
- テスト出力がファイルにある場合は、ファイル全体を読んで失敗件数を特定し検証してください
- テストを実行することは、テストが合格したことを検証することと同じではありません
- 失敗がゼロであることを明示的に確認するまで、先に進まないでください
- テストが失敗した場合(failed > 0):
- 失敗したテストの件数を明確に述べてください
- 各失敗を分析し、どの機能が壊れたのかを理解してください
- よくある原因: null の扱い、空のコレクションのチェック、条件ロジックの誤り
- リファクタリング後のコードにおける根本原因を特定してください
- 元の挙動を復元するようにリファクタリング後のコードを修正してください
- テストを再実行し、出力で「failed=0」を検証してください
- すべてのテストが合格する(failed=0)まで繰り返してください
- コンパイルを検証する - コンパイルエラーがないことを確認してください
- 認知複雑度を確認する - 指標が目標しきい値
${input:complexityThreshold}以下であることを確認してください
確認チェックリスト
- コードがエラーなくコンパイルされる
- テスト結果に「failed=0」が明記されている(出力を読んで確認済み)
- すべてのテスト失敗が分析され、修正されている(失敗が発生した場合)
- 認知的複雑度が目標しきい値
${input:complexityThreshold}以下である - 元の機能がすべて保持されている
- コードがプロジェクトの規約と標準に従っている
コメント
Markdown 対応