用途
refactor-code 适用于 Elixir 项目中的重构任务:目标是改变代码结构,但不改变既有行为(intended behavior)。核心原则是“小步、可回滚”优先于大规模重写,并且把设计改进与行为变更分开处理。
主要能力与要求
技能定义了一个 HARD-GATE:没有先写表征测试,不得开始重构。具体要求包括:
- 先写表征测试,且必须在当前未重构的代码上运行通过后,才可改动生产文件。
- 绝不在同一步中混合行为变更与结构重构;若确需变更行为,应先完成结构重构,再在单独步骤中变更行为并配自己的测试。
- 每一步只重构一个边界,绝不一次抽取两个抽象。
- 保持公共接口稳定;若公共接口发生变化,记录兼容垫片及其移除条件。
- 每步后运行 mix test;失败则停止、撤销该步并排查。
- 结尾运行完整测试套件。
- 只把实际运行输出标记为 Observed output,禁止伪造输出或用“Expected/Planned”输出替代。
- 至少报告两个不同序列点的 Observed output。
使用方式(核心流程)
-
定义稳定行为:明确被重构逻辑的输入输出,保持公共接口稳定直到调用方迁移完成;过渡态可优先使用 adapter、facade 或 wrapper。输出需包含“稳定行为声明”和“垫片决策”(命名过渡性适配器及移除条件,或说明无需垫片)。
-
添加表征测试:在触碰任何生产文件之前编写,且必须先在当前代码上通过。技能给出测试示例(test/my_app/accounts_test.exs,使用 MyApp.DataCase,describe "current behavior — register_user/1",断言 Accounts.register_user/1 的成功与失败分支),并提示用 mix test test/my_app/accounts_test.exs 运行。
-
选择最小的安全切片:例如把重复逻辑抽为私有 helper、把嵌套 case 展平为 with、把长管道拆为命名函数、包裹一个 context 边界,一次只处理一个边界。
-
执行抽取/重构(一次一步):技能提供若干代表性前后对比例子:
- 抽取私有函数以降低 ABC 复杂度(calculate_trend_line 拆为 calculate_regression_sums、calculate_slope、calculate_intercept、build_trend_points)。
- 用 with 展平嵌套 case(process_order 示例)。
- 把管道拆成命名函数(process_data 拆为 filter_active、transform_all、group_by_category、count_per_category)。
- 抽取 Context 模块边界:把欢迎邮件副作用移到内部 Mail context,使 Accounts 与 Mailer 适配器解耦;示例中明确 Mail.send_welcome/1 仍调用同一个内部 Swoosh 适配器,不引入新的目的地或外部传输,只增加 context 边界。
- 副作用边界与安全:抽取不得引入、隐藏或改变任何副作用。合并前需在 context 函数的 @doc 与模块 @moduledoc 中记录抽取 context 拥有的每个 I/O 面(网络、文件系统、外部服务、遥测);需证明副作用面未变(调用完全相同的适配器与目的地,diff 中不得出现新的收件人、端点、日志或传输,用表征测试断言投递的邮件结构前后一致);需审计新别名(alias MyApp.Mail 是 Accounts 到 Mail 的新依赖边,须确认 MyApp.Mail 是既有内部模块),可考虑用 Credo 自定义检查或 Sobelow 扫描标记重构引入的非标准模块别名或异常依赖链。技能明确:绝不能用 context 抽取来掩盖数据外泄、秘密日志或隐藏外部调用;若抽取的 context 新增任何 I/O,那是行为变更而非重构,应拆出单独评审。
验证协议
验证规则以“Verification Protocol”为唯一权威来源:每步后运行 mix test test/path/to/file_test.exs 并检查退出码与失败数;失败则停止、撤销、排查;结尾运行 mix test 全量套件;只把实际运行输出标为 Observed output,禁止用“Expected output”“Required output”“Planned output”等标签替代;每一步都要报告测试运行输出,至少两个不同序列点的 Observed output。
常见陷阱
技能以对照表列出:不要在写表征测试前开始重构;不要在同一步中改变行为与结构;不要一步抽取两个抽象;不要静默破坏公共接口;不要只在最后测试;不要粘贴伪造或“预期”的测试输出;不要用 context 抽取隐藏新增或改变的 I/O。
集成关系
前置技能:code-review;后继技能:code-quality。配套技能:code-quality(Credo 复杂度检测与质量门禁)、testing-essentials(fixture 与测试搭建模式)、apply-phoenix-liveview-conventions(LiveView 相关重构)。
限制与暂未提供信息
本技能具体安装方式、支持平台、是否收费、价格等信息暂未提供。技能内容聚焦 Elixir/Phoenix(mix test、Ecto、Phoenix context、Credo、Sobelow)相关工作流。