用途
该技能将重构定义为一项与功能开发相互独立的、安全且有纪律的活动。其目标是消除代码中的偶然复杂度,同时不改变程序行为,使代码库更易理解和扩展。它主要解决一种常见失败模式:把行为变更与结构变更混在同一个提交中,导致审查、调试和回滚都变得困难。
主要能力
技能围绕若干核心实践展开:
- 首要规则:重构前绿,重构后绿。 开始重构前必须所有测试通过,结束重构时不得有任何测试失败。若重构过程中测试失败,应撤销改动,因为这意味着行为被改变了,而不只是结构。开始前和每个重构步骤后都要运行完整测试套件,“我确信测试仍然通过”不构成证据。
- 行为与结构分离提交。 绝不把行为变更和重构放在同一个提交中。正确顺序是:RED-GREEN-DOMAIN-COMMIT(行为变更),然后是重构提交(仅结构变更,测试保持绿色)。错误做法是在一个提交里同时实现功能、重命名变量并提取方法。
- 一次只做一个重构。 每步只应用一个重构操作,运行测试,绿色则提交,再进行下一个。连续执行多个重构而不在中间测试,会掩盖是哪个改动导致了问题。
安全重构目录
技能提供了一组在识别到相应代码坏味道时应用的模式:
- 提取方法/函数:当一段代码有可命名的明确目的时,将其提取为具有描述性名称的函数。函数名应解释“为什么”而非“是什么”。
- 内联方法/函数:当函数体与其名称一样清晰,或间接层没有价值时,用函数体替换调用。
- 重命名:当名称无法传达意图时,对变量、函数、类型、模块、文件进行重命名以匹配领域语言,并更新所有引用,检查术语表以使用规范术语。
- 移动:当代码位于错误的模块或文件时,依据领域边界和内聚性将其移到正确位置,并更新导入。
- 引入解释变量:当表达式复杂时,将其提取为能解释用途的命名变量。
- 以多态替换条件:当条件语句(if/else、switch/match)根据类型选择行为时,替换为多态分派。这是较大的重构,需要提交中间步骤。
- 删除死代码:当代码不可达或未使用时将其删除,不要注释掉,版本控制会记住。
- 简化条件:当布尔表达式复杂时,分解为命名谓词或合并冗余分支。
使用方式
该技能以建议性指导的形式工作,指示智能体将重构与行为变更分离,并在整个过程中保持测试绿色。在具备委派原语的执行环境中,可以通过在重构步骤之间运行测试来在结构上强化这种分离。技能本身没有机械强制手段阻止在一个提交中混合行为与结构;如果观察到智能体把重构与功能工作混在一起,应指出这一点。
在 TDD 流程中,每个 COMMIT 阶段之后都要评估代码是否需要结构改进;如果需要,则在开始下一个 RED 阶段前以单独提交进行重构。在 ensemble-team 工作流中,重构步骤是强制性的,每个提交周期都包含重构检查。在代码审查中,当审查发现命名、重复、复杂度等结构问题时,应作为独立于功能修复的重构提交来处理。
适用场景
适用于在测试保护下清理代码结构、降低偶然复杂度、提升可读性与可扩展性的场景,尤其适合采用 TDD 或 ensemble-team 工作流的团队,以及需要在代码审查后处理结构问题的场合。
限制
技能明确列出不应重构的情况:测试失败时(先修复再重构);处于 TDD 的 GREEN 阶段中间时(先完成 GREEN、提交,再重构);重构需要修改测试断言时(那是行为变更,不是重构);以及尚未理解代码时(先阅读、理解,再重构)。
验证清单
完成由该技能指导的工作后,需验证:重构开始前所有测试通过;每个重构步骤后所有测试通过;行为未改变(测试断言未变);重构与行为变更在不同提交中;每个提交包含一个逻辑重构操作;名称在适用处匹配领域术语表;死代码被删除而非注释掉。若任一标准未满足,应撤销重构并重试。
依赖
该技能可独立使用。为增强工作流,可与以下技能集成:tdd(重构发生在每个 TDD COMMIT 阶段之后,TDD 技能将重构步骤视为周期中的强制环节)、code-review(审查发现的结构问题输入到重构工作)、domain-modeling(领域模型类型和术语表为重命名重构中的命名决策提供依据)。缺少依赖时可用命令安装:npx skills add jwilger/agent-skills --skill tdd