简介
"上移方法"(Pull Up Method)重构手法用于消除子类中的重复方法逻辑。当多个子类包含相同实现的方法时,将这些方法提升到父类可以集中维护核心逻辑。
典型代码坏味道
- 多个子类中存在相同签名和实现的方法
- 重复的方法级业务规则
- 子类方法仅调用父类方法的简单重写
重构步骤
-
识别重复方法
- 找到子类中完全相同的public/protected方法
- 确认方法语义在各子类中一致
- 检查方法是否访问子类特有字段
-
在父类中声明方法
- 将方法声明移至父类
- 调整访问修饰符(通常为protected)
- 使用模板方法模式处理差异点
-
移除子类方法
- 删除子类中的重复方法
- 处理可能存在的@Override注解
- 保留需要特殊实现的子类方法
-
验证与测试
- 验证多态调用正确性
- 检查方法可见性范围
- 确保继承体系完整性
示例
重构前:
class Salesman extends Employee {
public void generateReport() {
// 完全相同的报表生成逻辑
formatHeader();
collectData();
exportPDF();
}
}
class Manager extends Employee {
public void generateReport() {
// 完全相同的报表生成逻辑
formatHeader();
collectData();
exportPDF();
}
}
重构后:
abstract class Employee {
protected void generateReport() {
formatHeader();
collectData();
exportPDF();
}
}
class Salesman extends Employee {
// 不再需要重写方法
}
class Manager extends Employee {
// 不再需要重写方法
}
专项练习
基础练习
-
重构动物类方法
class Cat extends Animal { public String getDescription() { return "四足哺乳动物"; } } class Dog extends Animal { public String getDescription() { return "四足哺乳动物"; } }
进阶练习
-
多态方法提升
class Circle extends Shape { protected void draw() { setupCanvas(); renderCircle(); flushBuffer(); } } class Rectangle extends Shape { protected void draw() { setupCanvas(); renderRect(); flushBuffer(); } }
代码审查清单
优势验证
- 子类代码重复率降低90%以上
- 核心逻辑集中维护
- 增强多态扩展能力
风险提示
- 可能破坏现有方法重载
- 需要处理泛型方法中的类型参数
- 影响子类特定实现的灵活性