开启 3 天免费试用
注册即可免费体验全部高级功能。
*仅限新用户;每位用户只能获得一次试用。


要用 AI 重构代码,先冻结行为,再逐个测试小改动。遵循如何使用 AI限定范围;模型输出是提案,不是等价证明。
关键要点
- 编辑前先定义可观察行为。
- 冻结修订、允许文件、命令、环境与回退点。
- 用特征测试保护不明确的遗留行为。
- 先让 AI 给只读方案,再逐个批准小变换。
- 比较输出、错误、状态、副作用及必要的性能属性。
- 测试通过是证据,不是语义等价的普遍证明。
- 范围扩大或测试预言不足时立即停止。
重构是在保留可观察行为的前提下改善现有代码设计。Martin Fowler 将其描述为一连串小型、保持行为的变换;小步推进能降低系统长期处于损坏状态的风险。[1]
| 请求 | 是否属于重构 | 应采用的流程 |
|---|---|---|
| 改内部辅助函数名称且调用方不变 | 通常是 | 保持行为的重构 |
| 拆分长函数且输出和副作用不变 | 通常是 | 重构加特征测试 |
| 修改错误码或响应字段 | 不是 | 带兼容审查的契约变更 |
| 修正算错的结果 | 不是 | 使用调试流程 |
| 更换协议或数据库结构 | 不是 | 使用代码迁移计划 |
| 只因模块看起来陈旧就重写 | 暂时不是 | 先定义问题和可观察契约 |
不要把功能、缺陷修复、依赖升级或政策调整藏在 AI 代码重构里。只要期望行为需要变化,就应拆成另一项变更,单独定义验收条件。
向模型提供上下文前,先建立一张重构卡。它让任务可复现,也能阻止看似聪明的建议悄悄扩大补丁。
| 字段 | 合成示例 |
|---|---|
| 重构 ID | RF-017 |
| 起始修订 | reviewed-revision-id |
| 目标 | 抽取重复解析逻辑 |
| 允许文件 | parser.ts、parser.test.ts |
| 禁止变化 | 公开类型、消息、数据库写入 |
| 测试命令 | 单元测试加一个集成场景 |
| 环境 | 运行时版本与相关标志 |
| 回退点 | 干净分支或已保存补丁 |
| 负责人 | 逐步审批的工程师 |
同时记录生成文件、忽略文件、本地改动与不可用依赖。不要把整个私有仓库交给未经批准的服务;只提供完成任务所需的最小代码与契约,并移除凭据、客户资料、私有 URL 和生产配置。
权限边界和提示词同样重要。OpenAI 把沙箱与审批描述为互补控制:前者限制可写位置与网络,后者让高风险动作停下来接受复核。[3]默认从只读、窄写入范围和无网络开始。
“不改变行为”必须说明观察者。纯函数可能只看返回值和错误;服务还会暴露 HTTP 状态、字段、事件顺序、事务、日志字段、重试、时间预算与下游消息。
| 行为 ID | 输入或前置条件 | 期望观察 | 预言 | 是否必须保持 |
|---|---|---|---|---|
B-01 | 合法合成记录 | 相同规范化对象 | 精确断言 | 是 |
B-02 | 缺少必填字段 | 相同错误类型和代码 | 快照加类型检查 | 是 |
B-03 | 重复事件 | 只发生一次幂等写入 | 集成断言 | 是 |
B-04 | 10,000 条批次 | 在获批预算内完成 | 受控基准 | 仅在契约要求时 |
加入失败、边界与状态转换,不要只测正常路径。标出哪些行为是明确设计、哪些是调用方依赖的历史特征、哪些仍未知。未写入文档的细节也可能已经成为兼容契约。
性能不必自动成为语义行为,但真实系统可能把延迟、内存或顺序写进服务目标。此时要先定义阈值与测量环境,不能在看到结果后让 AI 临时发明标准。
首次编辑前运行获批命令,并保存完整退出码与结果。如果没有证明相同测试在起始修订通过,重构后的绿色结果就缺少可比较对象。
遗留代码意图不清时,用特征测试记录当前观察。它们描述“现在做什么”,不表示每个历史细节都永远正确。生成测试的流程可帮助枚举输入,但期望值必须来自规范、调用方、测试夹具或受控基线,而不是让模型照着当前实现猜。
基线包至少记录:
若实现与测试由同一个模型同时猜测,二者可能共享同一错误假设,这不是独立证据。
先要求模型解释当前路径并拆出最小步骤,让“理解”与“修改”分开。
目标:改善内部结构,同时保持 Behavior ID B-01..B-04。
范围:只允许 parser.ts 和 parser.test.ts;公开类型与消息冻结。
证据:已附基线命令和结果。
先返回只读计划,把每项编辑对应到代码坏味道、不变量和检查它的测试。
不得编辑文件、添加依赖、改变行为、删除测试或运行网络/高权限命令。
缺少证据的内容标为 [UNKNOWN]。
要求它列出假设、受影响调用方、副作用和每步回退方法。若模型无法沿代码追踪数据或状态,可先使用解释陌生代码的方法,不要急着授权编辑。
GitHub 的负责任使用文档指出,AI 生成代码可能看起来合理却在语义上错误,敏感应用尤其需要复核与测试。[2]自信的方案仍只是假设。
先批准最小且可逆的改动,例如重命名局部符号、抽取纯辅助函数、移除已证实的重复、把嵌套条件改为等价保护条件,或隔离适配器。不要让模型一次重写整个模块。
每一步之后:
避免在行为敏感重构中混入大范围格式化。噪声会掩盖条件、默认值、遗漏分支和错误路径变化。若必须格式化,应拆成独立且可复现的机械步骤。
模型若提出更换公开名称、新增库、修改并发或重写数据库,就先停止。这些可能有价值,但需要新的契约与风险评估。
| 层级 | 前后比较内容 |
|---|---|
| 纯逻辑 | 返回值、错误、状态变更、确定性 |
| 公开 API | 状态、字段、类型、顺序、兼容性 |
| 持久化 | 语句、事务边界、影响行数 |
| 事件与队列 | 主题、载荷、数量、顺序、幂等性 |
| 文件 | 路径、字节、权限、必要原子性 |
| 并发 | 取消、所有者、竞态、资源释放 |
| 运维 | 日志、指标、告警、启动与失败行为 |
使用合成或获批测试夹具。对非确定输出比较稳定属性,而不是不断接受被重写的快照;对时间行为控制时钟;只有契约允许时才固定随机种子,并继续检查允许范围。
测试通过只能提高置信度,不能证明所有状态都等价。NIST 的生成式 AI 风险资料把虚构、隐私、信息安全与人工监督纳入生命周期治理。[4]模型解释自己补丁为何安全时,同样需要外部证据。
脱离模型叙述重新读最终差异,检查条件、默认值、异常、清理路径、边界转换、锁和外部调用。然后可用AI 代码审查方法做第二视角,但不能把它当唯一批准者。
出现以下任一情况就回退当前步骤:
归档行为台账、命令、结果、剩余缺口、复核人和最终修订。“AI 说等价”不是证据;小型可解释差异与可重复观察才是。
重构以小步骤改善内部结构,并保持已定义行为;重写替换更大的实现,等价性问题和风险范围通常更宽。
不能。测试只证明选定案例在选定环境中的观察一致,还需结合规范、类型检查、复核、集成证据和安全监控。
它记录意图不完整或不明确代码的当前可观察行为。它保护已经被依赖的行为,但不宣称每个历史特征都永远正确。
通常不应。先限制一个关注点和少量文件,逐步验证;大规模生成式重写很难定位行为变化的具体原因。
覆盖率只显示代码是否执行,不证明断言正确,也不覆盖所有相关状态。还要检查断言质量、边界、副作用和集成路径。
在合理范围内控制时间和随机性,再比较稳定不变量、允许范围或事件集合。不要因为精确相等麻烦就不断接受变化的快照。
只有预先写入契约的性能属性需要保持在获批预算内。要在可比较环境测量,并区分真实回归与噪声。
从重构中拒绝该步骤,另建兼容或迁移提案,明确消费者、版本、上线与回退。
代码不能进入获批工具、行为预言缺失、补丁无法被人理解,或任务跨越高风险权限边界而没有合格监督时,应避免或严格限制。
Sources checked 2026 年 9 月 4 日。
注册即可免费体验全部高级功能。
*仅限新用户;每位用户只能获得一次试用。