简介
"用显式方法替换参数"(Replace Parameter with Explicit Methods)重构手法用于消除控制方法行为的类型码参数。当方法通过参数值执行不同分支的逻辑时,应该拆分为多个独立命名的具体方法。
典型代码坏味道
- 方法内部存在switch/case或if-else链检查参数
- 参数类型为枚举或特定常量
- 方法名称无法清晰表达所有可能的行为
- 新增参数值需要修改现有方法逻辑
重构步骤
-
识别控制参数
- 查找接受类型码参数的方法
- 分析参数控制的逻辑分支
- 确定每个分支的独立语义
-
创建具体方法
- 为每个参数值创建新方法
- 将对应逻辑迁移到新方法
- 保持原方法作为过渡
-
修改调用方
- 替换所有传递特定参数值的调用
- 更新单元测试用例
- 处理多态调用场景
-
移除原方法
- 删除包含类型码参数的方法
- 清理相关文档注释
- 验证接口兼容性
示例
重构前:
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();
}
}
专项练习
基础练习
- 重构日志记录器
class Logger {
public void log(String level, String message) {
if ("ERROR".equals(level)) {
writeError(message);
} else if ("INFO".equals(level)) {
writeInfo(message);
}
}
}
进阶练习
- 处理复杂类型码
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数量
- 需要更新所有调用方
- 处理遗留系统的反射调用