简介
"删除对参数的赋值"是提升代码可靠性的关键重构手法。通过保持参数输入的不可变性,可以避免意外的状态变更,增强代码的可预测性和可维护性。
针对的症状(代码坏味道)
- 函数内部修改参数值
- 参数被多次重新赋值
- 存在参数值与实际用途不符的情况
- 需要跟踪参数值的多次变化
删除参数赋值的详细步骤
- 识别参数赋值
- 查找被重新赋值的参数
- 标记所有参数修改点
- 创建临时变量
- 用新变量保存原始参数值
- 使用明确语义命名变量
- 替换参数引用
- 用临时变量替代参数使用
- 保持业务逻辑不变
- 验证逻辑
- 确保计算结果正确性
- 检查边界条件处理
示例
重构前代码:
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);
}
练习
基础练习题
-
简单参数修改
// 重构前 void greet(String name) { name = name.trim(); System.out.println("Hello " + name); }
进阶练习题
-
复合参数处理
// 重构前 void process(List<String> items) { items = new ArrayList<>(items); // 修改参数引用 items.removeIf(String::isEmpty); processItems(items); }
综合拓展练习题
-
多重赋值场景
// 重构前 void calculate(int base) { base += 10; if (base > 100) { base /= 2; } return base; }
代码审查要点
-
优点:
- 保持参数不可变性
- 减少副作用风险
- 明确变量生命周期
-
潜在问题:
- 注意性能影响
- 处理引用类型深拷贝
- 保持代码简洁性