简介
"用查询替换临时变量"是提升代码表达力的重要重构手法。通过将中间计算结果封装为方法,可以消除临时变量的副作用,提高代码的可测试性和可维护性。
针对的症状(代码坏味道)
- 存在重复计算的临时变量
- 复杂表达式产生中间结果
- 需要提高代码可读性
- 临时变量阻碍方法拆分
用查询替换临时变量的详细步骤
- 识别候选变量
- 查找只赋值一次的临时变量
- 确认变量计算逻辑无副作用
- 提取查询方法
- 将变量计算封装为新方法
- 保持方法功能纯净
- 替换变量引用
- 用方法调用替换变量使用
- 移除变量声明
- 优化方法
- 合并相似查询方法
- 优化方法命名
示例
重构前代码:
double calculateTotal(Order order) {
double basePrice = order.getQuantity() * order.getPrice();
double discount = Math.max(0, basePrice - 1000) * 0.05;
return basePrice - discount;
}
重构步骤:
-
提取basePrice查询:
private double getBasePrice(Order order) { return order.getQuantity() * order.getPrice(); } -
最终重构结果:
double calculateTotal(Order order) { return getBasePrice(order) - getDiscount(order); } private double getDiscount(Order order) { return Math.max(0, getBasePrice(order) - 1000) * 0.05; }
练习
基础练习题
-
简单变量替换
// 重构前 double circleArea(double radius) { double pi = 3.14159; return pi * radius * radius; }
进阶练习题
-
复合计算替换
// 重构前 String formatName(User user) { String fullName = user.getLastName() + ", " + user.getFirstName(); return "Dear " + fullName.toUpperCase(); }
综合拓展练习题
-
多变量重构
// 重构前 double calculateEnergy(double mass) { double c = 299792458; return mass * c * c; }
代码审查要点
-
优点:
- 提高代码可读性
- 减少重复计算
- 方便逻辑复用
-
潜在问题:
- 控制方法粒度
- 避免过度提取
- 注意计算性能