ChatGPT×プログラム 大きなコードを扱うときに固まらない工夫

AI

AIがたくさんの事をできるようになり、プログラムをAIに「こういうことがしたい!」と頼むことが増えてきました。そして、最近はChatGPTでプログラムを作っているときに、コードが600行を超えたあたりから「修正を頼むと動作が遅い」「返事が返ってこない」ということが頻発しました。
作業のサイクルが長くなり、効率が下がってしまうのは大きなストレスとなっています。

そこで見つけたのが、「全文ではなく差分(unified diff)」で修正箇所だけやり取りする方法です。
この工夫を取り入れてから、ChatGPTとのやり取りが一気に軽くなり、作業がスムーズになりました。

この記事前半では、初心者でも体験できるように「シンプル電卓アプリ」を題材に、

  1. 完成版を動かす
  2. わざとバグらせる
  3. 差分だけで直す
    という流れを実際にやってみます。

「差分(unified diff)」ってなに?

プログラムの修正点を表す方法のひとつで、

  • - が削除する行
  • + が追加する行
    というルールで修正部分だけを表示します。

イメージは「赤線で消して青線で追加する」感じです。
全文ではなく修正部分だけを見られるので、ChatGPTも人間も理解が早くなります。

1. シンプル電卓(完成版)を動かす

記事をただ読むより、以下のコードを実際に修正しながら読むと理解しやすい気がします。

手順

  1. 以下のコードを app.py として保存します。
# file: app.py
import tkinter as tk
from tkinter import ttk, messagebox

class CalculatorApp(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("シンプル電卓")
        self.geometry("320x220")
        self.resizable(False, False)
        self._build_ui()

    def _build_ui(self):
        frm = ttk.Frame(self, padding=12)
        frm.pack(fill=tk.BOTH, expand=True)

        ttk.Label(frm, text="数値1").grid(row=0, column=0, sticky=tk.W, padx=4, pady=4)
        self.entry1 = ttk.Entry(frm, width=18)
        self.entry1.grid(row=0, column=1, sticky=tk.W, padx=4, pady=4)

        ttk.Label(frm, text="数値2").grid(row=1, column=0, sticky=tk.W, padx=4, pady=4)
        self.entry2 = ttk.Entry(frm, width=18)
        self.entry2.grid(row=1, column=1, sticky=tk.W, padx=4, pady=4)

        btns = ttk.Frame(frm)
        btns.grid(row=2, column=0, columnspan=2, pady=8)
        ttk.Button(btns, text="+", width=6, command=self.on_add).grid(row=0, column=0, padx=3)
        ttk.Button(btns, text="-", width=6, command=self.on_sub).grid(row=0, column=1, padx=3)
        ttk.Button(btns, text="×", width=6, command=self.on_mul).grid(row=0, column=2, padx=3)
        ttk.Button(btns, text="÷", width=6, command=self.on_div).grid(row=0, column=3, padx=3)
        ttk.Button(btns, text="クリア", width=8, command=self.on_clear).grid(row=0, column=4, padx=8)

        sep = ttk.Separator(frm)
        sep.grid(row=3, column=0, columnspan=2, sticky="ew", pady=8)

        self.result_var = tk.StringVar(value="結果:")
        ttk.Label(frm, textvariable=self.result_var, font=("", 12, "bold")).grid(
            row=4, column=0, columnspan=2, sticky=tk.W, padx=4
        )

    def _read_numbers(self):
        a = self.entry1.get().strip()
        b = self.entry2.get().strip()
        if a == "" or b == "":
            raise ValueError("数値が空です")
        try:
            return float(a), float(b)
        except Exception:
            raise ValueError("数値として解釈できません")

    def _show_result(self, value):
        self.result_var.set(f"結果:{value}")

    def _safe_calc(self, op_name, f):
        try:
            x, y = self._read_numbers()
            self._show_result(f(x, y))
        except ZeroDivisionError:
            messagebox.showerror("エラー", "0で割ることはできません。")
        except ValueError as e:
            messagebox.showerror("入力エラー", str(e))
        except Exception as e:
            messagebox.showerror("エラー", f"{op_name} エラー: {e}")

    def on_add(self):
        self._safe_calc("加算", lambda x, y: x + y)

    def on_sub(self):
        self._safe_calc("減算", lambda x, y: x - y)

    def on_mul(self):
        self._safe_calc("乗算", lambda x, y: x * y)

    def on_div(self):
        self._safe_calc("除算", lambda x, y: x / y)

    def on_clear(self):
        self.entry1.delete(0, tk.END)
        self.entry2.delete(0, tk.END)
        self._show_result("")

if __name__ == "__main__":
    app = CalculatorApp()
    app.mainloop()
  1. PowerShell(またはコマンドプロンプト)で実行
python app.py
  1. 画面に「数値1」「数値2」の入力欄とボタン、結果ラベルが出れば成功です。

2. わざとバグらせてみる

学習用に、あえて「文字列連結バグ」を仕込みます。
on_add を次のように書き換えてください。

def on_add(self):
    # ❌ バグ:文字列のまま結合(2 + 3 → 23)
    a = self.entry1.get()
    b = self.entry2.get()
    self._show_result(a + b)

バグの症状

  • 数値1に「2」、数値2に「3」を入力 → 「+」を押す
  • 本来は「結果:5」になるところが、「結果:23」と表示される

3. 差分(unified diff)で修正

ChatGPTに依頼するときは、関数だけを指定して、差分で返してもらいます

依頼文例

【目的】on_add で文字列連結ではなく数値の加算に修正
【範囲】app.py の on_add 関数のみ
【制約】他は触らない。出力は30行以内
【出力】unified diff 形式

返答イメージ

--- a/app.py
+++ b/app.py
@@
-    def on_add(self):
-        # ❌ バグ:文字列のまま結合(2 + 3 → 23)
-        a = self.entry1.get()
-        b = self.entry2.get()
-        self._show_result(a + b)
+    def on_add(self):
+        # ✅ 修正:数値として取得してから加算
+        self._safe_calc("加算", lambda x, y: x + y)

こうすることで、ChatGPTは修正部分だけ返してくれるので、やり取りが速く・わかりやすくなります。

まとめ(前半)

  • ChatGPTが重くなる原因は「全文を読み直して書き直す」から
  • 差分(unified diff)を使えば「修正箇所だけ」でやり取りできる
  • 小さなアプリで練習すると、すぐに体感できる

ここまでが**前半(初心者向け編)**です。
👉 後半では「実務者向けTips集」として、依頼テンプレ・スレッド運用・出力量制限・Git適用法などをまとめます。

コメント