Chapter 25: AI で簡単な修正をする
バグ修正・リファクタリングの依頼方法
25.1 バグ修正の依頼方法
AI に効果的にバグ修正を依頼するには、「何が起きているか」「何が期待されるか」を明確に伝えることが重要です。 情報が多いほど、AI は正確に問題を特定できます。
バグ報告のテンプレート
## 問題
[何が起きているかを具体的に]
## 期待する動作
[本来どうなるべきか]
## 再現手順
[どうすれば再現できるか]
## エラーメッセージ / ログ
[エラーがあれば貼り付ける]
## 関連コード
[問題が起きているコード]実際の依頼例
## 問題
ユーザーの年齢が 0 のとき、バリデーション関数がクラッシュする
## 期待する動作
年齢が 0 のときは false を返し、エラーなく動作する
## エラーメッセージ
TypeError: Cannot read properties of undefined (reading 'toString')
at validateAge (src/utils/validation.ts:15)
## 関連コード
function validateAge(user: User): boolean {
if (user.age.toString().length > 0) { // ← ここでクラッシュ
return user.age >= 0 && user.age <= 120;
}
return false;
}バグ修正の流れ
Copilot Chat でのバグ修正
コードを選択して Ctrl+I → 「このバグを修正してください」が最もシンプルな方法です。
出典: VS Code 公式ドキュメント
TODO: あとで実際のスクリーンショットに置き換え - コードを選択してインラインチャットでバグ修正を依頼している画面
エラーログを貼り付けてサイドバーの Chat で相談する方法も有効です。
以下のエラーが発生しています。原因と修正方法を教えてください。
TypeError: Cannot read properties of null (reading 'map')
at OrderList.render (src/components/OrderList.tsx:23:5)25.2 リファクタリングの依頼
リファクタリングとは、動作を変えずにコードの品質を改善する作業です。 AI はリファクタリングの候補を提案し、実行することができます。
リファクタリングの種類と依頼例
可読性の改善:
この関数を読みやすくリファクタリングしてください。
変数名を明確にして、複雑な条件式をシンプルにしてほしいです。
function p(d, t, s) {
return d > 0 ? (t / d) * s : 0;
}重複コードの削除:
src/utils/ 内に似たような日付フォーマット関数が複数あります。
共通化して1つにまとめてください。型安全性の向上(TypeScript):
この関数の any 型を適切な型定義に置き換えてください。パフォーマンスの改善:
この関数は大量データで遅くなります。
O(n²) の処理を O(n) に改善できますか?
function findDuplicates(arr) {
const duplicates = [];
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[i] === arr[j]) duplicates.push(arr[i]);
}
}
return duplicates;
}リファクタリングの注意点
重要: リファクタリング後は必ずテストを実行して動作が変わっていないことを確認します。 テストがない場合は、リファクタリング前にテストを書くことを強く推奨します。
25.3 変更内容のレビュー
AI に修正を依頼した後、変更内容を必ず自分でレビューします。 AI の修正が常に正しいとは限らないからです。
レビューのチェックリスト
変更内容を確認する際のチェックポイント:
□ 変更の意図は正しく反映されているか
□ エッジケースが考慮されているか
□ エラーハンドリングが適切か
□ 既存のテストがすべて通るか
□ パフォーマンスに問題はないか
□ セキュリティ上の問題がないか
□ コードスタイルが統一されているかAI に変更内容を説明させる
修正後、AI に変更点を説明させることで理解が深まります。
修正した内容を箇条書きで説明してください。
各変更がなぜ必要だったかも教えてください。Git diff でレビューする
Claude Code が複数ファイルを変更した場合、git diff で全体の変更を確認します。
# 変更の概要を確認
git diff --stat
# 変更内容を詳細に確認
git diff
# 特定のファイルの変更を確認
git diff src/utils/validation.tsTODO: あとで実際のスクリーンショットに置き換え - git diff で変更内容を確認している画面
25.4 修正の検証方法
AI が行った修正が正しく動作するかを確認します。
ユニットテストで検証
バグ修正の場合、そのバグを再現するテストを書いてから修正すると確実です。 AI にテストも一緒に書いてもらいましょう。
この validateAge 関数のバグを修正して、
age が 0 の場合のテストケースも追加してください。生成されるテストの例:
describe('validateAge', () => {
// 既存テスト
it('有効な年齢を受け付ける', () => {
expect(validateAge({ age: 25 })).toBe(true);
});
// バグ修正のためのテスト(新規追加)
it('年齢が 0 のとき false を返す', () => {
expect(validateAge({ age: 0 })).toBe(false);
});
it('null/undefined でクラッシュしない', () => {
expect(validateAge({ age: null })).toBe(false);
expect(validateAge({})).toBe(false);
});
});手動で動作確認
テスト以外にも、実際に動かして確認することが大切です。
# アプリを起動して手動確認
npm run dev
# テストを実行して回帰がないか確認
npm test
# 型チェックを実行
npm run type-checkClaude Code での検証フロー
Claude Code を使う場合、修正からテストまでを一連の流れで依頼できます。
この validateAge のバグを修正してください。
修正後は以下を実行して問題がないか確認してください:
1. 既存のテストをすべて実行
2. 修正したバグのテストケースを追加
3. TypeScript の型チェック25.5 うまくいかないときの対処法
AI の修正が期待通りにならないことがあります。その場合の対処法を紹介します。
問題1: 修正が的外れ
症状: AI が関係ない部分を修正したり、問題の本質を誤解している
対処法:
# より具体的な情報を提供する
問題は validateAge 関数の中の「user.age.toString()」の部分です。
user.age が 0 のとき、0.toString() は "0" になって、
length は 1 なので条件は通りますが、
実際には「0 という数値は age として無効」と判定したいです。
期待する動作は「age が 0 のとき false を返す」です。問題2: 修正が部分的
症状: 一部のケースは直ったが、他のエッジケースで問題が残る
対処法:
# 残っている問題を具体的に伝える
age が 0 の場合は直りましたが、
age が負の数(-1 など)や 200 を超える場合も
false を返してほしいです。現在はどうなっていますか?問題3: 修正が複雑すぎる
症状: シンプルに修正できるはずなのに、大がかりな変更をされた
対処法:
# シンプルさを明示的に要求する
もっとシンプルに修正してください。
変更は最小限にして、既存のコードスタイルを維持してください。問題4: テストが通らない
症状: AI の修正後にテストが失敗する
対処法:
# まず失敗しているテストを確認
npm test -- --verbose
# エラーメッセージを AI に共有修正後にこのテストが失敗しています:
FAIL src/utils/validation.test.ts
● validateAge › 有効な年齢の上限
Expected: true
Received: false
at Object.<anonymous> (src/utils/validation.test.ts:15:5)
このテストが失敗している原因を調査して修正してください。問題5: AI が何度修正しても直らない
症状: 同じ問題が繰り返し発生する
対処法: セッションをリセットして、問題を再度整理してから依頼します。
# Claude Code の場合
/clear
# 新しいセッションで、最小再現コードと問題を明確に伝える「最小再現コード」を作ることが効果的です。問題が起きている最小限のコードを切り出して共有します。
// 最小再現コード
function validateAge(user: { age: number | null | undefined }): boolean {
if (user.age.toString().length > 0) { // ← ここでクラッシュ
return user.age >= 0 && user.age <= 120;
}
return false;
}
// 再現する呼び出し
validateAge({ age: 0 }); // TypeError が発生まとめ
AI を使った修正作業のポイント:
| ポイント | 詳細 |
|---|---|
| 情報を具体的に | エラーログ・再現手順・期待動作をセットで伝える |
| レビューを忘れない | AI の修正は必ず自分で確認する |
| テストで検証 | 修正前後でテストを実行して回帰がないか確認 |
| 段階的に進める | 一度に大量の修正を依頼しない |
| うまくいかなければリセット | 会話を整理して再依頼する |
AI は強力なアシスタントですが、最終的な判断と責任は開発者にあります。 AI の提案を理解した上で適用することを心がけましょう。