RailsConf 2014 - All the Little Things by Sandi Metz
ConfreaksYouTube ↗
延伸阅读 2
字幕解读
Sandi Metz 以 Gilded Rose 的长条件分支为例,演示如何依靠测试逐步重构:先建立执行路径和小方法,把测试保持绿色,再提炼小对象、消息接口与工厂,最终让新增商品规则无需修改既有逻辑。她主张在理解问题前容忍重复,避免过早引入错误抽象;中间步骤可能暂时增加复杂度,但小对象能降低同时需要理解的范围。结尾讨论开闭原则、适用的浅窄继承层次,以及复杂度指标的参考价值和局限。
英文字幕轨道 · 引文按字幕原文展示,可点时间戳回看片段。
内容要点
- 先用测试保护行为,再以小步重构建立接缝、拆分条件分支,减少一次改动影响的代码范围。
- 重复代码有时比错误抽象更容易处理;等待更多需求信息,能帮助判断哪些变化应抽象在一起。
- 通过对象角色、消息传递和工厂把选择对象与对象行为分开,可让新规则扩展而不修改旧逻辑。
视频章节 6
- 小类与小方法的方向
- 用 Squint Test 识别复杂度
- 测试保护下的小步重构
- 保留重复,避免错误抽象
- 开闭原则与对象角色
- 继承边界与最终设计
具体观点与证据 3
重构中尚未看清所有行为时,保留重复往往比过早提取错误抽象成本低;可以先标记重复,等更多案例提供信息。
不把重复本身当优点,而是比较未知抽象的风险。
It is far cheaper to keep duplication than it is to have to mess
with the wrong abstraction.用工厂选择合适对象,再通过统一消息执行行为,可把类型选择规则与具体业务动作分离。
Gilded Rose 重构示例,配置映射仍需维护。
I have separated
the reason I'm switching from the thing I do when I switch.重构的中间步骤可能增加复杂度,不能因每步指标暂时上升就否定通向更小对象的整体重构。
讲者强调有行为测试与明确设计方向的重构,不是为无限复杂化辩护。
Intermediate refactorings often
make code more complicated, but if you know the rules,补充字幕原文 2
演讲的核心建议是拆小类与方法,并降低组件彼此需要了解的内容。
make smaller things面对重复与错误抽象的选择时,作者倾向先保留重复,以免抽象增加后续修改成本。
It is far cheaper to keep duplication than it is to have to mess with the wrong abstraction.解读边界
演讲围绕一个 Ruby Kata 展开,提出的重构路径依赖测试覆盖和对对象设计原则的判断;Flog 等复杂度指标仅作辅助,并不等同于可读性或维护成本。