什么算行为不变
行为不变指的是对外可观察的行为保持一致:接口返回值、异常与错误码、日志格式、副作用、协议输出,以及性能所处的数量级。内部实现、私有结构、算法步骤、代码行数都可以改。判断不清时,先写一条断言当前行为的测试再动手,绿灯就说明没有破坏约定。
基本信息
| 属于行为 | 返回值、异常、错误码、副作用、协议输出、性能数量级 |
|---|---|
| 不属于行为 | 私有方法命名、内部数据结构、代码行数与注释 |
| 验证手段 | 以现状写断言测试,重构后仍应绿灯 |
| 边界情形 | 日志文本、缓存策略、超时参数往往被当作内部细节,实际会被外部依赖 |
常见边界判断
| 改动 | 是否行为变化 | 说明 |
|---|---|---|
| 提取私有函数 | 否 | 调用方无感知 |
| 调整日志文本 | 是 | 监控与排障依赖日志内容 |
| 更换内部缓存实现 | 可能 | 命中率与一致性语义可能改变 |
| 修改接口错误码 | 是 | 调用方契约改变 |
| 调整重试次数 | 是 | 故障时的请求量与耗时都随之变化 |
怎么验证行为不变
- 先写行为基准测试:把当前输出固定成断言,再开始改结构。
- 覆盖外部可见面:返回值、异常、错误码、输出格式。
- 检查副作用:写库、发消息、调第三方接口的次数与顺序。
- 关注性能量级:从一次查询变成多次查询,即使结果相同也属于行为变化。
- 把不确定的地方记进描述:评审者能据此判断需要重点看哪部分。
- 对比重构前后的接口契约文档:契约没变,才谈得上行为不变。
拿不准某改动是否属于行为变化:先写测试断言现状再改,绿灯说明未破坏约定。
日志与错误码经常被误认为内部细节:只要监控、告警或调用方依赖它们,就属于对外契约。