重构手法——函数行为重塑类 | 语意 | 用显式方法替代参数

49 阅读2分钟

简介

"用显式方法替换参数"(Replace Parameter with Explicit Methods)重构手法用于消除控制方法行为的类型码参数。当方法通过参数值执行不同分支的逻辑时,应该拆分为多个独立命名的具体方法。

典型代码坏味道

  • 方法内部存在switch/case或if-else链检查参数
  • 参数类型为枚举或特定常量
  • 方法名称无法清晰表达所有可能的行为
  • 新增参数值需要修改现有方法逻辑

重构步骤

  1. 识别控制参数

    • 查找接受类型码参数的方法
    • 分析参数控制的逻辑分支
    • 确定每个分支的独立语义
  2. 创建具体方法

    • 为每个参数值创建新方法
    • 将对应逻辑迁移到新方法
    • 保持原方法作为过渡
  3. 修改调用方

    • 替换所有传递特定参数值的调用
    • 更新单元测试用例
    • 处理多态调用场景
  4. 移除原方法

    • 删除包含类型码参数的方法
    • 清理相关文档注释
    • 验证接口兼容性

示例

重构前:

class Shape {
    public void draw(int shapeType) {
        switch (shapeType) {
            case CIRCLE:
                drawCircle();
                break;
            case RECTANGLE:
                drawRectangle();
                break;
            default:
                throw new IllegalArgumentException();
        }
    }
}

重构后:

class Shape {
    public void drawCircle() {
        drawCircle();
    }

    public void drawRectangle() {
        drawRectangle();
    }
}

专项练习

基础练习

  1. 重构日志记录器
class Logger {
    public void log(String level, String message) {
        if ("ERROR".equals(level)) {
            writeError(message);
        } else if ("INFO".equals(level)) {
            writeInfo(message);
        }
    }
}

进阶练习

  1. 处理复杂类型码
class PaymentProcessor {
    public void process(String paymentMethod, BigDecimal amount) {
        if ("CREDIT_CARD".equals(paymentMethod)) {
            processCreditCard(amount);
        } else if ("CRYPTO".equals(paymentMethod)) {
            processCrypto(amount);
        }
    }
}

代码审查清单

优势验证

  • 方法调用意图清晰度提升100%
  • 完全消除类型码检查逻辑
  • 符合开闭原则

风险提示

  • 可能增加公共API数量
  • 需要更新所有调用方
  • 处理遗留系统的反射调用