Extract Variable 是什么
把复杂表达式的一部分取出为有名字的变量:条件判断与算术运算因此能表达意图,调试时也便于观察中间结果。命名是关键——名字要说明「这是什么」,而不是复读表达式本身。它与 Extract Function 是一对:差别在于是否需要复用与是否需要跨越作用域。
基本信息
| 场景 | 长表达式、条件分支中难懂的子表达式 |
|---|---|
| 命名 | 用业务含义命名,避免 temp1 式命名 |
| 对比 | Extract Function 适合需要复用或跨作用域的情况 |
| 自动化 | 主流 IDE 都支持一键提炼变量,改完立即跑测试 |
适用判断
- 条件里出现一长串布尔运算,读一遍记不住
- 同一子表达式在相邻几行重复出现,容易改漏一处
- 表达式的含义需要靠注释解释,注释其实就是变量名
- 调试时需要在中间点观察值,但表达式没有落脚处
- 算术公式里的每一项都对应业务概念,但代码里只是一串符号
Java 示例
Java 示例
// 之前
if (platform.toUpperCase().indexOf("MAC") > -1 &&
browser.toUpperCase().indexOf("IE") > -1 &&
resize > 0) { ... }
// 之后:变量名承担了原本要靠注释解释的含义
boolean isMacOs = platform.toUpperCase().contains("MAC");
boolean isIE = browser.toUpperCase().contains("IE");
boolean wasResized = resize > 0;
if (isMacOs && isIE && wasResized) { ... }提炼变量还是提炼函数
| 情况 | 选择 | 理由 |
|---|---|---|
| 表达式只在本函数用一次 | Extract Variable | 局部命名足够,成本最低 |
| 同一表达式需要在别处复用 | Extract Function | 避免复制或跨层访问 |
| 表达式很长且含多处判断 | 先变量再函数 | 分两步降低改动风险 |
| 表达式带有副作用 | 先分离副作用 | 否则名字会误导调用者 |
变量命名复读表达式(aPlusB = a + b)没有增加任何信息,只是把行变多。有效的名字是能让读者跳过实现去理解意图的那些,例如 isMacOs 而不是 platformContainsMac。
在很长的函数里不断加变量而不提炼函数,函数长度会继续膨胀。变量和函数都是降低理解成本的手段,配合使用比只挑一种更有效。