关于 refactoring-best-practices
面向需要安全修改现有代码的开发者,提供渐进式重构指导。强调先保护行为并建立反馈,再以小步处理真实痛点。
主要功能
- 01先观察并记录现有行为
- 02通过特征测试建立反馈
- 03隔离高风险依赖
- 04按职责逐步调整代码
- 05提供遗留代码迁移参考
适用场景
- 01在缺少测试的代码中开始重构
- 02将基础设施依赖隔离到边界
- 03逐步拆分大型服务
- 04迁移持久化表示或错误契约
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ luckys/ agent-skills --skill refactoring-best-practices安装后在 Claude Code 中输入/refactoring-best-practices确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/characterization-tests.mdcode-smells.mdcompatibility-and-migration.mddomain-event-migration.mderror-contract-migration.mdfran-iglesias-refactoring-guidance.mdlanguage-examples.mdlegacy-code-techniques.mdrefactoring-moves.mdsafe-change-workflow.mdthird-party-notices.md详细介绍
重构最佳实践
当主要挑战是安全地修改现有代码时,请使用此技能。
工作方式
- 改进设计前,先保护现有行为。
- 优先采用小步、可逆的修改,避免大刀阔斧地重写。
- 先增加反馈,再增加抽象。
- 一次只修改一项职责。
- 根据当前的痛点决定下一步。
安全重构工作流
-
观察当前行为。
- 找出输出、副作用和错误路径。
- 明确哪些内容不得改变。
-
增加反馈。
- 优先围绕可见行为编写特征测试。
- 仅当测试不足时,才添加日志或临时探针。
-
找到接缝。
- 隔离时间、文件系统、网络、框架全局变量、单例和外部 API。
- 在风险依赖周围创建尽可能窄的边界。
-
选择下一步。
- 提取方法
- 提取类
- 引入值对象
- 引入一等集合
- 移动方法
- 用多态替换条件判断
- 将构造与行为分离
- 提取一个领域事件和一个次级订阅者
-
每完成一个有意义的步骤后,重新运行反馈机制。
高价值重构手法
- 用值对象替换内聚的领域参数组;如果参数组没有共同的领域含义或不变量,则使用参数对象。
- 将大型服务拆分为职责明确的协作对象。
- 将业务规则从控制器、脚本和工具类中移出。
- 用明确的角色替换类型代码和不稳定的条件判断。
- 在端口或适配器后封装基础设施。
- 如果不同的方法簇因不同原因而变化,则拆分类。
危险信号
- 一次性大规模重写。
- 尚未建立受保护的行为基线,就引入新抽象。
- 将代码拆成许多小类,却没有让模型更清晰。
- 仅为方便测试而引入继承。
- 只凭审美进行重构,却忽视风险。
决策规则
适合立即重构的情况
- 同一知识在多个位置重复
- 代码正在阻碍实际变更
- 下一个功能会加深耦合或重复
- 当前结构容易引发缺陷
适合暂缓的情况
- 还没有反馈循环
- 痛点只是臆测
- 抽象尚不稳定,不值得引入新类型
- 变更范围很广,但对代码的理解仍然不足
参考资料
-
修改调用方、删除旧路径或迁移持久化表示时,请阅读
references/compatibility-and-migration.md。 -
关于基于接缝的重构指导、感知与分离,以及遗留代码变更算法,请阅读
references/safe-change-workflow.md。 -
关于战术性重构手法,包括渐进式值对象迁移步骤,以及何时使用这些手法,请阅读
references/refactoring-moves.md。 -
关于识别问题、将随时间共同变化作为设计依据,以及选择合适的重构手法,请阅读
references/code-smells.md。 -
关于 Sprout、Wrap、Extract and Override 等适用于无测试环境的技术,请阅读
references/legacy-code-techniques.md。 -
关于如何在重构未测试代码前编写测试,请阅读
references/characterization-tests.md。 -
关于逐步将遗留副作用迁移到事件和订阅者、保留失败语义、实现可靠交接,以及将 CDC 作为迁移桥梁,请阅读
references/domain-event-migration.md。 -
关于如何安全地替换 null、字符串和通用异常,同时保留失败时机、诊断信息、脱敏行为和公共契约,请阅读
references/error-contract-migration.md。 -
关于从 Fran Iglesias 的实践中提炼出的重构启发式,请阅读
references/fran-iglesias-refactoring-guidance.md。 -
关于多种语言的前后对照示例,请阅读
references/language-examples.md。
相关技能
- 日常新代码决策请使用
oop-best-practices。 - 主要问题是选择对象协作模式时,请使用
design-patterns-best-practices。 - 移动不变量、拆分上帝聚合、引入根、变更一致性边界,或设计从旧版持久化中提取的领域 Repository 时,请使用
ddd-best-practices。 - 移动或回填持久化数据时,请使用
data-migration-best-practices;此技能仅负责围绕该操作性迁移构建安全的代码接缝和兼容路径。
来源影响
此技能综合了以下资料中的重要理念:
- Michael Feathers 著《Working Effectively with Legacy Code》
- Sandi Metz 著《99 Bottles of OOP》
- Sandi Metz 著《Practical Object-Oriented Design in Ruby》
- Fran Iglesias 的
Object Calisthenics系列 - CodelyTV Aggregates course(时间耦合与聚合演进)
- CodelyTV Value Objects course(从原始类型到领域值的渐进式重构)
- CodelyTV Repository Pattern course(从直接 SQL 到端口的渐进式重构)
- CodelyTV Domain Events course(旧系统中的事件接缝与 CDC 反例)
- CodelyTV Domain Modeling Errors course(渐进式异常转 Result 以及边界契约方面的经验)
- CodelyTV Four Rules of Simple Design course(保持行为的测试、删除推测性元素以及重复代码的反例)