Claude Code でリファクタリング|安全にコードを改善する方法
リファクタリングにClaude Codeが最適な理由
リファクタリングは「動作を変えずにコードの構造を改善する」作業です。地味ですが、保守性や拡張性を大きく左右する重要な作業です。
Claude Codeがリファクタリングに適している理由は明確です。
- コードベース全体を理解した上で変更できる - 影響範囲を把握し、変更漏れを防げる
- パターンを一貫して適用できる - 人間が見落としがちな箇所も漏れなく修正する
- テストを自動的に追加・更新できる - リファクタリングの安全性を担保できる
Claude Codeの基本操作を理解している方を対象に、安全なリファクタリングの進め方を解説します。
リファクタリングの大原則: テストファースト
リファクタリングで最も重要なのは、変更前にテストがあることです。テストがない状態でのリファクタリングは、動作を壊すリスクが高くなります。
ステップ1: 現状のテストカバレッジを確認
> テストカバレッジを確認して。
カバレッジが低い箇所をリストアップして。
ステップ2: テストを追加してからリファクタリング
> src/utils/formatters.ts のテストがありません。
まず現在の動作を保証するユニットテストを作成してから、
リファクタリングしてください。
この順序を守ることで、リファクタリングによる意図しない動作変更を検出できます。
実践的なリファクタリングパターン
パターン1: 大きな関数の分割
> src/services/orderService.ts の processOrder関数が200行を超えています。
以下の方針で分割してください:
1. バリデーション部分を別関数に抽出
2. 在庫確認部分を別関数に抽出
3. 支払い処理部分を別関数に抽出
4. 通知送信部分を別関数に抽出
各関数のテストも作成してください。
Claude Codeは関数の依存関係を分析し、適切な粒度で分割します。
パターン2: 型定義の改善
> プロジェクト全体でany型が使われている箇所を探して、
適切な型定義に置き換えてください。
型定義はsrc/types/に集約してください。
// Before
function processData(data: any): any {
return data.items.map((item: any) => ({
id: item.id,
name: item.name,
}));
}
// After
interface DataItem {
id: string;
name: string;
}
interface DataResponse {
items: DataItem[];
}
function processData(data: DataResponse): DataItem[] {
return data.items.map(({ id, name }) => ({ id, name }));
}
パターン3: 重複コードの統合
> src/components/ 配下で似たようなコードが重複している箇所を見つけて、
共通コンポーネントまたはカスタムフックに統合してください。
Claude Codeはコードの類似性を分析し、DRY原則に基づいた統合を提案します。
パターン4: ディレクトリ構成の見直し
> 現在のディレクトリ構成を分析して、以下の基準で再構成を提案してください:
1. 機能ごとにまとまっているか
2. 依存関係の方向は適切か(循環参照がないか)
3. ファイル名は規約に沿っているか
提案のみ。まだ実行しないでください。
大規模な構成変更は、まず計画を立ててから段階的に実行するのが安全です。
パターン5: APIレスポンスの正規化
> src/api/ のAPIレスポンス形式を統一してください。
すべてのエンドポイントで以下の形式を使用:
成功: { success: true, data: T }
エラー: { success: false, error: { code: string, message: string } }
関連するフロントエンドのコードも修正してください。
段階的リファクタリングの進め方
大規模なリファクタリングは一度に行わず、段階的に進めましょう。
フェーズ1: 分析と計画
> コードベース全体を分析して、リファクタリングが必要な箇所を
優先度順にリストアップしてください。
評価基準:
1. コードの複雑度(循環的複雑度)
2. 重複コードの量
3. テストカバレッジの低さ
4. 変更頻度の高さ
フェーズ2: テストの充実
> リファクタリング対象の箇所に対して、
まず現在の動作を保証するテストを追加してください。
テストが通ることを確認してから次に進みます。
フェーズ3: 段階的な修正
> リストの1番目の項目をリファクタリングしてください。
変更後、すべてのテストが通ることを確認してください。
1項目ずつコミットし、問題があれば簡単にrevertできるようにします。
コード品質の指標
リファクタリングの効果を測定するための指標を紹介します。
循環的複雑度
> src/ 配下の全ファイルの循環的複雑度を計算して、
複雑度が10を超える関数をリストアップしてください。
ファイルの行数
> 300行を超えるファイルをリストアップしてください。
それぞれの分割方針も提案してください。
依存関係の分析
> src/services/ の各ファイルのimport関係を分析して、
循環参照がないか確認してください。
CLAUDE.md にリファクタリング方針を記載する
CLAUDE.mdにリファクタリングの方針を記載しておくと、日常の開発でもClaude Codeが一貫した品質のコードを生成します。
## リファクタリング方針
- 関数は50行以内を目安にする
- ネストは3レベルまで(早期リターンを活用)
- any型は使用禁止(unknownを使う)
- マジックナンバーは定数に抽出する
- コンポーネントのpropsは5個以下を目安にする
リファクタリング時の注意点
1. 変更を小さく保つ
一度のコミットで変更する範囲を小さく保ちましょう。大きな変更は問題の切り分けを困難にします。
2. 動作の変更とリファクタリングを分ける
バグ修正や機能追加とリファクタリングは別のコミットにしましょう。混在すると、問題が起きたときの原因特定が難しくなります。
3. レビューしやすくする
リファクタリングのPRには、変更の意図と方針を明記しましょう。
## このPRの目的
orderService.tsの processOrder関数を責務ごとに分割し、
テストカバレッジを向上させる。
## 変更方針
- バリデーション → validateOrder()
- 在庫確認 → checkInventory()
- 支払い処理 → processPayment()
- 通知送信 → sendNotification()
## 動作の変更
なし(リファクタリングのみ)
まとめ
Claude Codeを使ったリファクタリングは、テストファーストの原則と段階的なアプローチを組み合わせることで、安全かつ効率的に行えます。日常的にClaude Codeと一緒にコード品質を改善する習慣をつけましょう。
デバッグと組み合わせた活用法は、Claude Codeでデバッグする方法を参考にしてください。セキュリティの観点からのコード改善については、Claude Codeのセキュリティも合わせてご覧ください。