Skip to content

SOP:重构迁移

用 Vibe Coding 安全重构代码、升级依赖、迁移架构的标准流程。

适用场景

  • 重构旧代码(消除重复、改善结构、提升可读性)
  • 升级依赖版本(框架升级、包版本更新)
  • 架构迁移(从单体到微服务、从 REST 到 GraphQL、从 MySQL 到 PostgreSQL)

前置条件

  • 项目已有完整的测试套件(没有测试就不能安全重构)
  • 有 git 仓库,每个步骤都能回退
  • 重构范围已经评估清楚

流程步骤

步骤 1:评估影响

重构前必须评估风险和影响范围。

直接复制风险评估表填写:

维度评估内容你的评估
变更范围涉及多少文件?多少行代码?[填写]
依赖关系变更的模块被多少其他模块依赖?[填写]
测试覆盖变更区域有没有测试?覆盖率多少?[填写]
回退难度如果重构失败,能回退吗?回退成本多高?[填写]
业务影响变更是否影响线上用户?有 downtime 吗?[填写]

风险等级判定:

总体风险特征推荐策略
少文件、少依赖、有测试、易回退一次完成,1-2 个会话
多文件、有测试、回退可行分批执行,每批 2-3 个文件
大范围、测试不全、回退困难分批执行 + 每批独立验证 + 人工审查每个变更

让 Claude 做初步评估:

用 Plan Mode 评估重构 [目标模块] 的影响:
1. 列出所有需要变更的文件
2. 分析每个文件的依赖关系(谁依赖它、它依赖谁)
3. 检查相关测试的覆盖情况
4. 评估风险等级

在 plan.md 中写出评估结果和重构方案。不要修改任何代码。

步骤 2:制定重构计划

让 Claude 在 Plan Mode 中生成详细重构方案:

读取 plan.md 的评估结果。生成重构实施计划:
1. 按什么顺序变更?(从最独立的模块开始,到最核心的模块)
2. 每批变更包含哪些文件?
3. 每批变更后如何验证?(跑什么测试)
4. 如果某批变更失败,回退策略是什么?

约束:
- 每批变更不超过 3 个文件
- 每批变更后必须能通过现有测试
- 保持对外接口不变(内部重构,外部不动)

审查重点:

  • 变更顺序是否正确?(先改底层 → 再改上层?还是反过来?)
  • 是否有遗漏的文件?
  • 对外接口是否真的不变?

步骤 3:分批执行

每批在一个会话中完成:

执行重构计划中的第 [N] 批:变更 [文件列表]。
完成后运行测试确认所有测试通过。如果有测试失败,最多尝试修复两次。

每批执行后的 checklist:

检查项状态
变更文件是否与计划一致[ ]
测试是否全部通过[ ]
对外接口是否不变[ ]
没有引入新的 lint 错误[ ]

通过后:git add + git commit(checkpoint commit)。

步骤 4:逐批验证

每批独立验证比全部完成后一次验证更安全。 因为:

  • 如果第 3 批有问题,你只需要回退第 3 批,不用从头重来
  • 每批验证缩小了"问题出在哪里"的搜索范围
  • 逐步确认对外接口不变

步骤 5:收尾清理

所有批次完成后:

检查重构后的整体状态:
1. 运行完整测试套件和 lint
2. 搜索是否有残留的旧代码引用(如 import 旧模块路径、调用旧函数名)
3. 确认没有遗留的 TODO 或临时注释
4. 更新 CLAUDE.md 中与重构相关的描述(如模块路径变了)

特殊场景

依赖升级 checklist

markdown
## 依赖升级:[包名] 从 [旧版本] 到 [新版本]

### 升级前
- [ ] 阅读 changelog / migration guide
- [ ] 确认 breaking changes 列表
- [ ] 在测试分支上升级
- [ ] 运行现有测试确认 baseline

### 升级中
- [ ] 执行升级命令
- [ ] 修复 breaking changes 导致的错误
- [ ] 运行测试
- [ ] 检查是否有新的 API 可用(优化机会)

### 升级后
- [ ] 全量测试通过
- [ ] 手动验证核心功能
- [ ] 更新 CLAUDE.md 中的版本信息
- [ ] 合并到主分支

架构迁移决策树

是否需要迁移架构?
├─ 否 → 保持现有架构,只做局部重构
├─ 是 → 迁移范围有多大?
    ├─ 小(1-2 个模块)→ 在一个 feature 分支完成
    ├─ 中(核心模块)→ 分批在 feature 分支完成 + 每批验证
    └─ 大(整个系统)→ 新仓库/新分支 + 逐步迁移 + 双系统并行过渡

常见问题

Q:没有测试怎么重构? A:先让 Claude 写测试。"为 [要重构的模块] 写测试,覆盖当前所有行为。测试通过后再开始重构。" 没有测试的重构是赌博。

Q:重构中发现需要改对外接口怎么办? A:停下来。更新 spec/plan,重新评估影响。不要在执行中临时决定改接口——这会让下游模块出问题。

Q:依赖升级后大量测试失败怎么办? A:不要让 AI 逐个修复——先让 Claude 分析所有失败的模式,判断是否是同一个 breaking change 导致。"分析所有测试失败,按原因分类。列出 breaking changes 的影响范围和批量修复策略。"

与其他 SOP 的关系

基于 MIT 协议发布