跳到主内容
重构

重构 Prompt:安全改一段代码

让 AI 重构时强制只调结构、不改行为:先说明这次重构不涉及哪些行为,再逐处改写并标注理由。适用于局部代码整理、命名与提取函数这类小范围改动,每处改写都说明改了什么、为什么。

发布 2026-06-21更新 2026-07-29

用法

选中要重构的代码段,配合下面的 prompt:

Prompt

请重构下面这段代码,要求:

**目标**:{改进可读性 / 提取函数 / 消除重复 / 改名 — 选 1}

**铁律**:
1. **不改变行为**。重构前后所有可观测行为必须 100% 一致(输入 → 输出 / 副作用)。
2. **不增加新功能**。如果你看到一个 bug,**告诉我但不要修**。
3. **不改 public API**(函数签名、导出名)。
4. **保留所有错误处理**。即使原代码错误处理写得很烂,也保留。修是另一个 PR 的事。
5. **保留所有注释**(除非注释明显不再准确)。

**输出**:
- 重构后的完整代码
- 一份 changelog:每条说明你**做了什么** + **为什么不破坏行为**
- 如果你看到 bug 或可疑代码,列在最后,**不要顺手改**

代码:
```
<paste here>
```

用法补充:什么时候用、怎么判断改完了

什么时候用:① 重复代码第三次出现、准备提取公共函数时;② 函数超过一屏、命名已经说不清它在干什么时;③ 准备给它补测试、但发现它根本没法测(依赖太多、分支太乱),需要先整理结构时。

什么时候别用:不要在大重构的前一天做纯整理式重构——它会制造大面积 diff,和真正的功能改动撞车后冲突解决成本极高。整理式重构安排在功能开发的间隙,单独一个 PR。

怎么判断「没改行为」:不要靠读代码,靠这三样——① 重构前的测试全绿(没有测试就先用 测试生成 Prompt 补一组行为基线);② diff 里没有逻辑关键字(没有新增 if、没有改比较运算符、没有改字符串字面量);③ 重构前后跑一遍相同的输入集,输出逐字节相同。第 ② 条最快:纯重构的 diff 应该看起来像「代码被搬了家」,而不是「代码被改了」。

为什么有效

  • "铁律"列得越具体,AI 越不容易"自作主张"。 只写「不要改变行为」,AI 会把它理解成「不要改变我注意到的行为」;写成「输入 → 输出 / 副作用 100% 一致」「不改 public API」「保留所有错误处理」,它才有可执行的判据。
  • "看到 bug 也不修"是关键。 AI 经常把重构 + bug fix 混在一起,让 review 变噩梦:你分不清哪一行是整理、哪一行是行为变更,而后者才是需要仔细审的部分。强制它「只报不修」,相当于把两类改动在 PR 层面物理隔开。
  • "changelog 解释为什么不破坏行为"逼 AI 真正思考等价性。 这是这条 prompt 里最不显眼但最有用的一句:AI 必须为每条改动写一句「为什么这不改变行为」,写不出理由的那一条,通常就是它悄悄改了行为的那一条。review 时优先看 changelog 里理由含糊的项。

进阶

分两步走(代码段大、不放心它一次改完时):

  1. 第一轮 prompt 加:"不要写代码,先告诉我你打算做哪些改动,列清单。"
  2. 看清单 → 删掉你不同意的项 → 再让它执行剩下的

更安全。

变体 A —— 让 AI 自己证明等价性:

"重构完成后,请给出一份等价性论证:对每个被改动的函数,说明输入相同时输出为什么必然相同。如果某个改动你无法证明等价,标出来并说明风险,不要含糊带过。"

变体 B —— 用测试锁行为(推荐给没有测试的模块):

"在重构之前,先为这段代码生成一组描述当前行为的测试(包括不合理的行为),跑通并提交。重构以这组测试全绿为验收标准。不要为了通过测试而修改测试。"

配合 测试生成 Prompt 使用。

自动化:把「重构 → 跑测试 → 失败就回滚」交给终端 Agent,人只审 diff:

git checkout -b refactor/date-format
claude -p "把 src/utils/ 下三处重复的日期格式化逻辑提取成公共函数。
铁律:不改变任何行为——包括三处里格式不一致的那一处,必须保留原样。
改完执行 npx vitest run,不通过就 git checkout -- src/utils/ 回滚并告诉我原因。"
git diff --stat   # 纯重构的 diff 里不该出现逻辑关键字

上面那条「三处里格式不一致的那一处必须保留原样」不是多余的——AI 的默认倾向就是顺手统一,而统一 = 改行为。凡是「看起来更合理」的改动,都要显式禁止或显式批准,不能留给 AI 自己判断。

一个真实场景

让 AI"提取一个重复的日期格式化逻辑成公共函数",最容易出的事故是它顺手把行为也改了:

  • 原代码三处格式化里有一处用的是 YYYY-MM-DD,另两处是 YYYY/MM/DD——AI 提取时"统一"成了一种,悄悄改了两处的输出。
  • 原代码对 null 日期返回空字符串,AI 提取后改成返回 'Invalid Date'。

这两个改动单看都"更合理",但它们改变了可观测行为,可能让依赖旧格式的下游(前端展示、报表、其它服务)出问题。这条 prompt 的"铁律 1:不改变行为"和"看到 bug 也只报不修"就是专门拦这类"好心办坏事"。

大规模重构怎么办

这条 prompt 适合改一段代码。如果是跨文件、改接口签名的大重构,用 大规模安全重构 Prompt——它多了影响分析、测试基线、分步验证。

延伸阅读

相关对比

Aider vs Claude Code:终端 AI 编程双雄怎么选

Aider vs Claude Code 2026 选型对比:开源 BYOK 多模型 vs Anthropic 订阅长任务 Agent,从编程能力、多模型支持、价格、Git 集成、国内可用性和适合人群判断,帮你选对终端 AI 编程工具。

Cursor vs Aider:GUI IDE 还是 CLI?2026 对比

Cursor vs Aider 2026 选型对比:GUI IDE vs Git 原生 CLI,从 Composer vs Architect 双模型、Tab 补全、多模型 BYOK、价格计费、开源与否和适合人群判断,帮开发者选对。Cursor 是闭源 VS Code fork 月费 $20,Aider 是开源 Apache-2.0 CLI 自带 API key。

Augment Code vs Cursor:企业 AI 编程怎么选?Context Engine vs AI IDE 对比

Augment Code vs Cursor 2026 选型对比:Context Engine 全仓索引的企业 AI 平台 vs SpaceX 收购的 AI IDE 天花板,从形态、Context 覆盖、长任务、价格、合规、中文支持和适合人群 8 个维度判断,帮你选对企业 AI 编程工具。

Claude Code vs Cline:CLI AI Agent 怎么选?2026 对比

Claude Code vs Cline 2026 选型对比:Anthropic 官方闭源 CLI Agent vs Apache-2.0 开源 VS Code 插件。从模型绑定、工作流、MCP 支持、价格、隐私和适合人群 6 个维度帮你选对 CLI AI 编程工具。

Claude Code vs Codex CLI:终端 AI Agent 双雄对比

Claude Code vs Codex CLI 2026 选型对比:Anthropic 与 OpenAI 两大官方终端 Agent 的模型、长任务、MCP 生态、Windows 支持、订阅打包价格和国内可用性全方位对比,帮你判断该用哪个终端 AI Agent,以及能不能两个一起用。

Claude Code vs Crush:Anthropic 官方 vs 多模型 TUI(2026 实测选型)

Claude Code vs Crush 怎么选:Anthropic 官方 CLI(长任务最稳),对上 Charmbracelet 开源 TUI(多模型切换 + LSP)。按模型、长任务、价格对比。

相关评测