1. 結論(この記事で得られること)
この記事では、Claudeを使ってレガシーコードを安全にリファクタリングする実務的な手法を解説します。
得られるもの:
- Claude活用によるリファクタリング工数の50%削減
- 仕様の暗黙知を明示化するプロンプト戦略
- テストコードがない状態からの段階的な安全化手順
- レビュー観点をAIで補強する具体的フロー
私も5年前、「動いてるコードに触るな」と言われて放置されたPHP4時代のコードを、結局3ヶ月かけて書き直した苦い経験があります。今ならClaudeを使えば、その半分の時間で、しかも安全にリファクタできます。
2. 前提(環境・読者層)
想定読者
- レガシーコードのメンテナンスを任されたエンジニア(2年目〜)
- テストコードがない or 少ない環境で開発している方
- リファクタリングのリスクを減らしたい方
必要な環境
- Claude 3.5 Sonnet(API or Pro版)
- 対象言語:問わない(本記事ではJavaScript/TypeScript例)
- Git環境(コミット粒度を細かく刻む前提)
注意事項
- AIの出力を無批判に適用するのは危険です
- 必ず差分レビュー・段階的適用・テスト実行を挟みます
3. Before:よくあるつまずきポイント
3-1. 「全部書き直したい衝動」に駆られる
// レガシーコード例
function calc(a, b, c) {
var result = 0;
if (c == 1) {
result = a + b;
} else if (c == 2) {
result = a - b;
} else if (c == 3) {
result = a * b;
} else {
result = a / b;
}
return result;
}
「これ全部Classにして型付けて…」と思うけど、どこで使われてるか分からない。grep で100箇所ヒットして絶望。
3-2. 仕様が口頭伝承しかない
- 「c=0の時は割り算」が仕様なのか、バグなのか分からない
- 「昔の担当者が辞めた」パターン
- ドキュメントはExcelの設計書(最終更新2015年)
3-3. テストがない、または形骸化している
// 形骸化したテスト
test('calc test', () => {
expect(calc(1, 2, 1)).toBe(3); // これしかない
});
c=2,3,4 の挙動が不明。でもこのテストは通ってる。
4. After:基本的な解決パターン
4-1. 段階的リファクタリングの鉄則
① 理解 → AIで仕様を明示化
② 保護 → 既存挙動を網羅するテストを生成
③ 分離 → 小さく分割(1機能=1commit)
④ 置換 → 段階的に新コードへ
⑤ 削除 → 旧コードを安全に除去
4-2. Claudeを使った基本フロー
# プロンプト例1:仕様の明示化
以下のコードの仕様を、**暗黙の前提も含めて**ドキュメント化してください。
・引数の取りうる値の範囲
・エッジケース(0除算、null、undefinedなど)
・戻り値の型と例外の有無
"""
[対象コード]
"""
Claude の出力例:
## 仕様分析
**calc関数の責務**
- 2つの数値に対して四則演算を行う
- 第3引数で演算種別を指定(1:加算, 2:減算, 3:乗算, それ以外:除算)
**暗黙の仕様(推定)**
- c=0 でも除算が実行される(仕様かバグか要確認)
- b=0 の時の0除算チェックなし(実行時エラーの可能性)
- 型チェックなし(文字列が渡されると意図しない挙動)
**リスク箇所**
- `c == 1` は厳密等価ではない("1" でもtrueになる)
これだけで仕様レビュー会議の叩き台ができます。