坏味道:什么时候该重构的气味罗盘
1. 这一章讲什么
会做手术不等于知道该给谁做手术。这一章回答「何时重构、闻到什么该伸手」:由 Kent Beck 提出的一套「坏味道」清单。本章原书由 Beck 与 Fowler 合写(自嘲:「插科打诨的部分是我写的,其余都是他写的」)1,24 个味道各自指向一批重构手法。我们不复述成目录,而是按「你站在代码面前,先看什么、再看什么」的决策顺序把它们重新组织成七组。
先给罗盘的使用说明。味道不是精确判据——「我们并不试图给你一个何时必须重构的精确衡量标准」2;它是见识广博者直觉的支架,让你在还没有直觉时有地方对号入座。起名「味道」来自 Beck 家奶奶的名言:「如果尿布臭了,就换掉它」3。
2. 顶层全景:七组味道
看见一段代码 ─┬─ 读得懂吗? ──── 神秘命名 ────────────── 组1 名字与重复
├─ 装得下吗? ──── 过长函数/过长参数列表 ── 组2 函数装不下
├─ 数据危险吗? ── 全局/可变/裸类型/泥团 ── 组3 数据不设防
├─ 改动怎么扩散? 发散式变化 vs 霰弹式修改 ─ 组4 变化的方向
├─ 东西在对的地方吗? 依恋/内幕/链/中间人 ── 组5 放错了位置
├─ 是为未来造的吗? 投机通用性/冗赘/遗赠 ── 组6 为不存在的未来
└─ 注释在解释什么? switch/循环/注释本身 ── 组7 三个老生常谈
图说:每组回答一个判断问题;一个味道常同时属于几组,罗盘给方向,不给判决。