该技能面向“主要挑战是安全修改既有代码”的重构场景,强调在改进设计之前先保护现有行为。
【工作方式】主张优先保护行为,偏好小而可逆的改动而非戏剧性重写;先添加反馈再添加抽象;一次只改变一个职责;由当前痛点决定下一步动作。
【安全重构流程】依次为:观察当前行为(识别输出、副作用与错误路径);识别哪些部分绝不能改变;添加反馈(优先围绕可见行为编写特征测试,测试不足时再添加日志或临时探针);寻找接缝(隔离时间、文件系统、网络、框架全局变量、单例和外部 API,围绕风险依赖建立尽可能窄的边界);选择下一步动作(提取方法、提取类、引入值对象、引入一等集合、移动方法、以多态替换条件、分离构造与行为、提取领域事件及一个次级订阅者);每个有意义的步骤后重新运行反馈。
【高价值重构手法】用值对象替换内聚的领域参数组(若该组无共享领域含义或不变量则改用参数对象);将大型服务拆分为按角色聚焦的协作者;把业务规则从控制器、脚本和工具类中移出;用显式角色替换类型码和不稳定条件;将基础设施封装在端口或适配器之后;当不同方法簇因不同原因变化时拆分类。
【红旗警示】大爆炸式重写;在缺乏受保护行为基线时引入新抽象;为拆分而拆分成微小类却无更清晰的模型;仅为便于测试而引入继承;仅凭美学而忽视风险进行重构。
【决策规则】当同一知识在多个位置重复、代码阻碍真实变更、下一个功能会加深耦合或重复、当前结构易导致缺陷时应立即重构;当尚无反馈回路、痛点是假设性的、抽象尚不稳定不足以成为新类型、变更面广但理解仍薄弱时应等待。
【参考资料】文档列出多份参考文件,涵盖兼容性与迁移、安全变更工作流、重构手法、代码坏味道、遗留代码技术、特征测试、领域事件迁移、错误契约迁移、实用重构启发式及多语言前后对比示例。
【关联技能】日常新代码决策用 oop-best-practices;选择对象协作模式用 design-patterns-best-practices;处理不变量迁移、拆分上帝聚合、改变一致性边界或塑造领域仓库时用 ddd-best-practices;移动或回填持久化数据用 data-migration-best-practices,本技能仅负责其周边的安全代码接缝与兼容路径。
【来源影响】该技能综合自《Working Effectively with Legacy Code》、Sandi Metz 的《99 Bottles of OOP》与《Practical Object-Oriented Design in Ruby》、Fran Iglesias 的 Object Calisthenics 系列,以及 CodelyTV 的聚合、值对象、仓库模式、领域事件、领域建模错误和简单设计四规则等课程。