iT邦幫忙

2026 iThome 鐵人賽

DAY 19
0
ChatGPT & Codex

從 Prompt 到 Pull Request:30 天玩懂 ChatGPT & Codex系列 第 19 篇

# Day 19|從能跑到好維護:讓 Codex 協助重構

  • 分享至 

  • xImage
  •  

前幾天完成了新增任務與瀏覽器持久化,昨天又替現有功能補上最少且必要的測試。

現在程式可以運作,也有測試保護重要行為,終於可以開始討論重構。

今天不增加任何產品功能,而是請 Codex 找出一個範圍小、改善明確的維護性問題,在外部行為不變的前提下整理程式。

什麼是重構?

重構是調整程式內部結構,但不改變外部可觀察行為。

對目前的 Issue Tracker 來說,重構前後都應該維持:

  • 首頁能正常顯示
  • 可以新增任務
  • 空白標題會被阻擋
  • 標題前後空白會被移除
  • 新增成功後輸入欄位會清空
  • 任務會寫入 localStorage
  • 重新建立 App 後能讀回任務

如果重構順便加入編輯功能、改變錯誤訊息或重新設計畫面,那就不再只是重構。

為什麼不在寫功能時順便整理?

功能修改和重構混在同一個 diff 時,Reviewer 很難判斷某一行改變是為了新需求,還是只調整程式結構。

一旦測試失敗,也不容易分辨原因來自行為變更或重構。

把兩者分開有幾個好處:

  • 每個變更只有一個主要目的
  • Diff 比較容易閱讀
  • 測試失敗時調查範圍較小
  • 發現問題時比較容易回復單一變更
  • 可以獨立判斷重構是否真的有價值

不是所有不漂亮的程式都要立刻重構

目前專案仍然很小。有些程式雖然可以抽成函式、hook 或 service,卻不一定已經造成維護問題。

值得優先處理的訊號包括:

  • 同一段邏輯重複出現
  • 一個元件同時負責太多不同事情
  • 儲存格式與畫面邏輯緊密混在一起
  • 函式過長,難以看出主要流程
  • 新增下一個功能時很容易改到不相關行為
  • 關鍵邏輯難以單獨理解或驗證

「可以拆」不等於「現在應該拆」。如果 Codex 只能說新的架構比較乾淨,卻無法指出目前的具體問題,這次可以選擇不重構。

先建立重構前基準

開始前,我會先確認:

  • Git working tree 沒有不明變更
  • 現有測試全部通過
  • lint 通過
  • build 成功
  • 手動操作新增與重新整理沒有問題

這些結果是重構前的行為基準。

如果測試原本就失敗,應該先釐清原因,而不是讓 Codex 在紅燈狀態下開始搬動程式。

第一階段:只找重構機會

我會開一個新的 Codex 任務,先要求分析、不修改:

目標:
請分析目前 Issue Tracker 的可維護性,找出範圍小、改善明確的重構機會。
這次只分析,不要修改任何檔案。

請先閱讀:
- AGENTS.md
- 目前的產品程式
- localStorage 持久化邏輯
- 現有測試
- 最近新增功能與測試的 Git 歷史

請找出具體問題,例如:
- 重複邏輯
- 過長或責任混雜的函式/元件
- 儲存與畫面邏輯過度耦合
- 不清楚的命名或資料流
- 會提高下一個功能修改風險的結構

對每項 finding 說明:
1. 檔案與行號
2. 目前造成的具體維護成本
3. 建議的最小重構方式
4. 預計影響的檔案
5. 如何證明外部行為沒有改變
6. 風險與不值得現在處理的理由

最後只推薦一個最適合這次執行的重構。
如果目前沒有足夠明確的機會,請直接說明,不要為了完成任務而製造抽象層。

先要求 findings,是為了讓「要不要重構」本身也接受 Review,而不是一開始就授權 Codex 大幅整理專案。

這段 prompt 的回覆

如何選擇今天的重構?

收到分析後,我會用下面幾個條件選擇:

判斷項目 問題
具體性 能指出目前程式中的實際問題嗎?
影響 能降低理解或修改成本嗎?
範圍 能在少量檔案內完成嗎?
行為 能保持 UI、資料與錯誤行為不變嗎?
驗證 現有測試能保護這次調整嗎?
時機 現在處理比等到功能增加後更合理嗎?

這次只選一個,不把所有「可以改善」的地方打包成大型重構。

如果建議是把 localStorage 的讀寫與解析從畫面元件中分離,就要說明它能改善什麼,例如讓元件主要負責互動與呈現,或讓未來修改儲存方式時不必碰觸畫面流程。

但實際採用哪個 finding,仍然要以 Codex 對目前 repository 的分析為準。

第二階段:小步實作

人工確認其中一項後,再繼續輸入:

請只實作剛才確認的那一項重構。

要求:
- 遵守 AGENTS.md
- 不改變任何使用者可觀察行為
- 不新增功能、套件或設定
- 不修改文案、樣式與資料格式
- 不處理其他 findings
- 優先使用最少的檔案與最小 diff
- 每個主要步驟後執行相關測試
- 如果發現必須改變外部行為才能完成,請停止並說明

開始前先記錄目前測試、lint 與 build 結果。
完成後再次執行相同驗證,並回報:
1. 實際修改的檔案與結構變化
2. 重構前後如何對應
3. 為什麼外部行為沒有改變
4. 重構前後的測試、lint 與 build 結果
5. 和原計畫是否有差異
6. 仍存在但這次刻意不處理的問題

這段 Prompt 明確要求只處理核准的 finding。否則 Codex 看到附近還有其他可整理的程式,很容易讓重構範圍一路擴大。

這段 prompt 的回覆

這是我的 repo,在裡面的 commit 找到 "reconstruct" 就是這篇文章寫完時的狀態。

檢查 diff

最後從 diff 再確認一次:

  • 修改只集中在核准的重構範圍
  • 沒有新增或刪除產品行為
  • 測試沒有被改成配合新實作
  • 沒有趁機重新格式化無關檔案
  • 沒有不必要的新依賴與設定
  • 所有原有驗證仍然通過

這次如果只是內部重構,原本以使用者行為為主的測試通常不需要跟著大改。若大量測試都必須重寫,可能代表測試過度耦合,也可能表示重構其實改變了外部介面。

今日小結

今天沒有要求 Codex 全面整理程式,而是先找出有證據的維護性問題,再選擇一個範圍小、改善明確的重構機會。


上一篇
# Day 18|讓 Codex 補單元測試,而不是湊覆蓋率
下一篇
# Day 20|讓 Codex 當第二雙眼睛:第一次 AI Code Review
系列文
從 Prompt 到 Pull Request:30 天玩懂 ChatGPT & Codex 共 20 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言