简介
"拆分变量"(Split Variable)是通过将承担多个职责的变量分解为多个独立变量来提高代码可读性的重构手法。这种方法适用于消除"万能变量"带来的理解成本。
针对的症状(代码坏味道)
- 重复赋值变量(Reassigned Variable)
- 多用途变量(Multi-purpose Variable)
- 魔术变量(Magic Variable)
拆分变量的详细步骤
-
识别问题变量
- 寻找多次赋值的变量
- 确认不同赋值点的语义差异
- 检查变量是否承担多个逻辑角色
-
创建新变量
- 根据用途命名新变量
- 保持变量不可变(推荐)
- 添加类型声明(强类型语言)
-
替换引用
- 在首次赋值处引入新变量
- 逐步替换旧变量引用
- 处理条件分支中的不同赋值
-
测试验证
- 确保控制流不受影响
- 验证计算逻辑正确性
- 检查边界条件处理
-
清理旧变量
- 删除不再使用的旧变量
- 重命名新变量保持语义
- 重构相关方法签名
示例
重构前温度转换代码:
```java
double temp = getCelsius();
temp =temp *9/5+32; // 转换为华氏度
if(temp >100){ // 此处判断实际应是摄氏度
// 处理逻辑
}
```
重构步骤:
- 拆分温度变量:
final double celsius = getCelsius(); final double fahrenheit = celsius * 9/5 + 32; if (celsius > 100) { // 使用明确语义的温度值 System.out.println("当前温度:" + fahrenheit + "℉"); }
练习
基础练习题
- 计算器变量拆分
- 重构以下代码,拆分result变量:
double result = initialValue; result += userInput * 0.15; // 计算手续费 result *= discountRate; // 应用折扣率
- 重构以下代码,拆分result变量:
进阶练习题
- 循环控制变量拆分
- 重构以下代码,拆分双重用途的count变量:
int count = 0; while (count < maxAttempts) { count += processItem(items[count]); // 同时作为索引和成功计数器 }
- 重构以下代码,拆分双重用途的count变量:
综合拓展练习
-
条件分支变量拆分
- 重构以下支付处理代码,拆分amount变量:
double amount = order.getTotal(); if (useCredit) { amount -= creditBalance; // 扣减信用额度 } else { amount *= currencyRate; // 货币转换 } amount += calculateFee(amount); // 添加手续费
- 重构以下支付处理代码,拆分amount变量:
-
代码审查模拟
- 完成重构后模拟审查发现:
- 优点:明确各阶段金额计算语义
- 潜在问题:可能增加内存消耗(需权衡)
- 改进建议:对不可变变量使用final修饰
- 完成重构后模拟审查发现: