重构手法——对象结构优化类 | 改进构造器 | 上移方法

52 阅读2分钟

简介

"上移方法"(Pull Up Method)重构手法用于消除子类中的重复方法逻辑。当多个子类包含相同实现的方法时,将这些方法提升到父类可以集中维护核心逻辑。

典型代码坏味道

  • 多个子类中存在相同签名和实现的方法
  • 重复的方法级业务规则
  • 子类方法仅调用父类方法的简单重写

重构步骤

  1. 识别重复方法

    • 找到子类中完全相同的public/protected方法
    • 确认方法语义在各子类中一致
    • 检查方法是否访问子类特有字段
  2. 在父类中声明方法

    • 将方法声明移至父类
    • 调整访问修饰符(通常为protected)
    • 使用模板方法模式处理差异点
  3. 移除子类方法

    • 删除子类中的重复方法
    • 处理可能存在的@Override注解
    • 保留需要特殊实现的子类方法
  4. 验证与测试

    • 验证多态调用正确性
    • 检查方法可见性范围
    • 确保继承体系完整性

示例

重构前:

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 {
    // 不再需要重写方法
}

专项练习

基础练习

  1. 重构动物类方法

    class Cat extends Animal {
        public String getDescription() {
            return "四足哺乳动物";
        }
    }
    
    class Dog extends Animal {
        public String getDescription() {
            return "四足哺乳动物";
        }
    }
    

进阶练习

  1. 多态方法提升

    class Circle extends Shape {
        protected void draw() {
            setupCanvas();
            renderCircle();
            flushBuffer();
        }
    }
    
    class Rectangle extends Shape {
        protected void draw() {
            setupCanvas();
            renderRect();
            flushBuffer();
        }
    }
    

代码审查清单

优势验证

  • 子类代码重复率降低90%以上
  • 核心逻辑集中维护
  • 增强多态扩展能力

风险提示

  • 可能破坏现有方法重载
  • 需要处理泛型方法中的类型参数
  • 影响子类特定实现的灵活性