目标
不改部署行为地重构基础设施代码是可能的,plan diff 就是证明它的测试套件。每抽一个模块、每参数化一个魔法值,都重跑 plan 对照基线:任何新增动作要么是重构引入的 bug,要么是被结构掩盖的死代码——后者删除即收益。
步骤要点
- 捕获行为基线:对当前状态跑 plan 并保存,空 diff 或仅已知差异就是重构必须保持的不变量。
- 行为保持的分步重构:一次只做一步——抽模块、参数化魔法值、拆文件——每步之后重跑 plan。
- 把 plan diff 当测试评审:超出基线的任何差异都算测试失败——重构改了行为就回退,暴露了死代码就刻意删除。
- 先沙箱后生产应用:重构后的代码先 apply 到沙箱捕捉 plan 看不到的运行时差异,再以同一份评审过的 plan 上生产。
- 结构存入下个变更:模块已抽出、参数已命名,下一次基础设施变更就是干净代码上的小 diff。
排错提示
每步 plan 都冒新动作说明重构混入了行为变更,立刻回退该步;plan 出现意外的 destroy 多半是死代码现形,核实后刻意删除并留档;重构完不做沙箱 apply 就上生产,运行时差异会替你发现结构问题。
适用边界
plan 等价保证声明态不变,运行时行为(Terraform provider 副作用)仍需沙箱验证;大型迁移式重构(换框架)不适用此不变量,需专门的迁移计划。
代码示例
baseline plan (saved): no changes
(state matches code exactly)
step 1: extract compute module
plan: identical to baseline OK
step 2: parameterize the magic 443->var.https_port
plan: identical OK
step 3: split env files (staging/prod)
plan: identical OK
step 4: remove unused security group
plan: DIFFERS -- destroy sg-044
-> dead code since 2024 (verified)
-> deliberate deletion, documented
sandbox apply: state identical to pre-refactor
next change (add region): 34-line diff
(was: 180-line copy-paste edit)