重构手法——函数行为重塑类 | 语意 | 删除对参数的赋值

58 阅读1分钟

简介

"删除对参数的赋值"是提升代码可靠性的关键重构手法。通过保持参数输入的不可变性,可以避免意外的状态变更,增强代码的可预测性和可维护性。

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

  • 函数内部修改参数值
  • 参数被多次重新赋值
  • 存在参数值与实际用途不符的情况
  • 需要跟踪参数值的多次变化

删除参数赋值的详细步骤

  1. 识别参数赋值
    • 查找被重新赋值的参数
    • 标记所有参数修改点
  2. 创建临时变量
    • 用新变量保存原始参数值
    • 使用明确语义命名变量
  3. 替换参数引用
    • 用临时变量替代参数使用
    • 保持业务逻辑不变
  4. 验证逻辑
    • 确保计算结果正确性
    • 检查边界条件处理

示例

重构前代码:

void discount(double price) {
    if (price > 100) {
        price *= 0.9; // 修改参数值
    }
    System.out.println("折后价:" + price);
}

重构后代码:

void discount(final double originalPrice) {
    double price = originalPrice;
    if (price > 100) {
        price *= 0.9;
    }
    System.out.println("折后价:" + price);
}

练习

基础练习题

  1. 简单参数修改

    // 重构前
    void greet(String name) {
        name = name.trim();
        System.out.println("Hello " + name);
    }
    

进阶练习题

  1. 复合参数处理

    // 重构前
    void process(List<String> items) {
        items = new ArrayList<>(items); // 修改参数引用
        items.removeIf(String::isEmpty);
        processItems(items);
    }
    

综合拓展练习题

  1. 多重赋值场景

    // 重构前
    void calculate(int base) {
        base += 10;
        if (base > 100) {
            base /= 2;
        }
        return base;
    }
    

代码审查要点

  1. 优点:

    • 保持参数不可变性
    • 减少副作用风险
    • 明确变量生命周期
  2. 潜在问题:

    • 注意性能影响
    • 处理引用类型深拷贝
    • 保持代码简洁性