なぜこう書くのか
リファクタリングのプロンプトで最もよくある失敗は、「この関数を整理して」と頼んだ結果、一見綺麗に見える新しいコードが丸ごと出力され、貼り付けた後になって初めて挙動が変わっていることに気づくケースです。どこで狂ったのかを探すには、結局2つのコードを1行ずつ突き合わせる羽目になります。
役割を「他人が作成したコードベースを保守してきた開発者」と設定したのは、作業スタンスを固定するためです。他人のコードを長く触ってきた人は、勝手に構造を改変しません。タスクの段落で「外部から見た振る舞い」を入力と出力、例外、副作用と具体的に書き下したのも同じ理由です。単に「挙動を維持してください」とだけ指示すると、戻り値の型だけ合わせてメール送信の順序を勝手に変えてしまうことがあります。
制約は変数として受け取ります。チームごとに変更できない事情は異なり、関数名が1つ変わるだけで呼び出し元がすべて壊れてしまうためです。条件と衝突する場合はコードを変更せず理由だけを述べるよう指示することで、AIが制約を勝手に破って「より良いコード」を提示してくる事態を防ぎます。
まず計画を受け取り、「進めてください」と返答してからコードを書かせる設計が、このプロンプトの肝です。一度にすべて受け取ると確認箇所が多すぎて、AIを鵜呑みにしてそのまま貼り付けがちになります。このように段階を踏んで進めることで、関数ごとに検証でき、気に入らない命名や分割の境界線を計画段階で修正できます。
計画表に「引数と戻り値」の列を入れたのも意図的な仕掛けです。名前と役割だけを決めると、分割した関数同士がグローバル変数を受け渡し合う構造になりがちですが、何を受け取って何を返すかを事前に書かせることで、責務の境界線が計画段階で明確になります。
用語が分からなければAha AIで: role-prompting, output-format
悪い例との比較
この関数長すぎるからリファクタリングして
(コードを貼り付け)
まったく異なる形状のコードが一度に出力され、その中で条件分岐の1つが静かに反転していたりします。どんな条件を守るべきか指定していないため、新しいライブラリが勝手に導入されたり関数名が変わって呼び出し元が動かなくなったりします。何をなぜ変えたのかの説明もないためレビューが実質不可能になり、結局元のコードに戻すことになります。
バリエーション
分割する前に何をしている処理なのか把握したいとき
以下の{{言語}}関数が行っている処理を、上から順に番号を振って箇条書きでリストアップしてください。各行は「〜する」と簡潔に書き、条件分岐はどのような場合にどこへ分岐するのかを併記してください。リファクタリングの提案は含めないでください。
""" {{コード}} """
他人が書いた関数を引き継いだ際に最初に使用します。改善提案を禁止することで、コードの理解と修正のフェーズが混ざるのを防ぎます。
重複したコードだけを抽出したいとき
あなたは{{言語}}の開発者です。以下のコードから同じ処理を繰り返している部分のみを特定してください。繰り返しが3箇所以上あるもののみを対象とし、共通化することでかえって可読性が下がるものは除外してください。該当箇所ごとに「重複部分・出現回数・共通化後のコード」の順で提示し、{{遵守すべき条件}}は必ず守ってください。
""" {{コード}} """
構造を大きく変えずに重複だけを減らしたいときに使います。「3箇所以上」という基準を設けないと、2回しか出てこない2行の処理まで関数に切り出されてしまい、かえってコードが読みにくくなります。
モデル別の注意
関数が長ければ長いほど、一度にすべて修正しようとすると途中で出力が途切れます。必ず最初に計画を出力させ、1塊ずつ進めてください。
関連プロンプト
最終更新 2026-09-02 · 誤りがありますか? 知らせる