重构手法——函数行为重塑类 | 语意 | 用查询替换临时变量

44 阅读1分钟

简介

"用查询替换临时变量"是提升代码表达力的重要重构手法。通过将中间计算结果封装为方法,可以消除临时变量的副作用,提高代码的可测试性和可维护性。

针对的症状(代码坏味道)

  • 存在重复计算的临时变量
  • 复杂表达式产生中间结果
  • 需要提高代码可读性
  • 临时变量阻碍方法拆分

用查询替换临时变量的详细步骤

  1. 识别候选变量
    • 查找只赋值一次的临时变量
    • 确认变量计算逻辑无副作用
  2. 提取查询方法
    • 将变量计算封装为新方法
    • 保持方法功能纯净
  3. 替换变量引用
    • 用方法调用替换变量使用
    • 移除变量声明
  4. 优化方法
    • 合并相似查询方法
    • 优化方法命名

示例

重构前代码:

double calculateTotal(Order order) {
    double basePrice = order.getQuantity() * order.getPrice();
    double discount = Math.max(0, basePrice - 1000) * 0.05;
    return basePrice - discount;
}

重构步骤:

  1. 提取basePrice查询:

    private double getBasePrice(Order order) {
        return order.getQuantity() * order.getPrice();
    }
    
  2. 最终重构结果:

    double calculateTotal(Order order) {
        return getBasePrice(order) - getDiscount(order);
    }
    
    private double getDiscount(Order order) {
        return Math.max(0, getBasePrice(order) - 1000) * 0.05;
    }
    

练习

基础练习题

  1. 简单变量替换

    // 重构前
    double circleArea(double radius) {
        double pi = 3.14159;
        return pi * radius * radius;
    }
    

进阶练习题

  1. 复合计算替换

    // 重构前
    String formatName(User user) {
        String fullName = user.getLastName() + ", " + user.getFirstName();
        return "Dear " + fullName.toUpperCase();
    }
    

综合拓展练习题

  1. 多变量重构

    // 重构前
    double calculateEnergy(double mass) {
        double c = 299792458;
        return mass * c * c;
    }
    

代码审查要点

  1. 优点:

    • 提高代码可读性
    • 减少重复计算
    • 方便逻辑复用
  2. 潜在问题:

    • 控制方法粒度
    • 避免过度提取
    • 注意计算性能