首页/开发/代码质量与评审速查/行为不变:重构的验收标准
重构手法62 条

行为不变:重构的验收标准

行为不变指对外可观察行为保持一致:接口输出、错误码、日志格式、副作用、性能数量级都属于行为;内部实现、私有结构、算法步骤可以改。

什么算行为不变

行为不变指的是对外可观察的行为保持一致:接口返回值、异常与错误码、日志格式、副作用、协议输出,以及性能所处的数量级。内部实现、私有结构、算法步骤、代码行数都可以改。判断不清时,先写一条断言当前行为的测试再动手,绿灯就说明没有破坏约定。

基本信息

属于行为返回值、异常、错误码、副作用、协议输出、性能数量级
不属于行为私有方法命名、内部数据结构、代码行数与注释
验证手段以现状写断言测试,重构后仍应绿灯
边界情形日志文本、缓存策略、超时参数往往被当作内部细节,实际会被外部依赖

常见边界判断

改动是否行为变化说明
提取私有函数否调用方无感知
调整日志文本是监控与排障依赖日志内容
更换内部缓存实现可能命中率与一致性语义可能改变
修改接口错误码是调用方契约改变
调整重试次数是故障时的请求量与耗时都随之变化

怎么验证行为不变

  • 先写行为基准测试:把当前输出固定成断言,再开始改结构。
  • 覆盖外部可见面:返回值、异常、错误码、输出格式。
  • 检查副作用:写库、发消息、调第三方接口的次数与顺序。
  • 关注性能量级:从一次查询变成多次查询,即使结果相同也属于行为变化。
  • 把不确定的地方记进描述:评审者能据此判断需要重点看哪部分。
  • 对比重构前后的接口契约文档:契约没变,才谈得上行为不变。
拿不准某改动是否属于行为变化:先写测试断言现状再改,绿灯说明未破坏约定。
日志与错误码经常被误认为内部细节:只要监控、告警或调用方依赖它们,就属于对外契约。

易错点

  • 顺手改日志格式:被监控解析依赖,排障时才暴露问题。
  • 把更换缓存实现当纯重构:命中率与一致性语义可能改变。
  • 只看返回值不看副作用:写库次数与调用顺序变化常被忽略。
  • 用「结果一样」判断行为不变:性能量级与错误语义同样属于对外行为。

数据来源与参考

  • 《重构》第 2 版 · 第 1 章(两顶帽子与行为保持)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌