RailsConf 2014 - All the Little Things by Sandi Metz
ConfreaksYouTube ↗
延伸阅读 4
都在写类,却对面向对象给出不同建议 →Metz 建议把类、方法和相互依赖变小;另一位讲者主张转向过程式风格,却明确说问题并不在类本身。两个片段帮助区分语言构造与组织代码的方式。小对象与小接口,不是同一个尺寸 →Metz 谈类和方法的粒度,以及彼此知道得更少;Bloch 谈 API 暴露的功能范围,并建议拿不准时不加入。可以比较内部拆分与外部接口收缩这两个不同设计维度。提防错误抽象,也要让必要抽象足够深 →Metz 提醒保留重复有时比维护错误抽象便宜;Ousterhout 则强调深模块以简单接口隐藏大量能力。把两者并读可帮助判断抽象质量:抽象不应只是消除重复,而应真正提供稳定、足够有价值的能力边界。小组件与值边界都在减少彼此耦合 →Metz 建议把代码拆成更小的东西;Bernhardt 说明以值作为对象边界,可以替代组件之间的同步方法调用。合读可把“缩小组件规模”和“选择低耦合交互方式”看作两个不同但互补的边界设计手段。
字幕解读
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 等复杂度指标仅作辅助,并不等同于可读性或维护成本。