简介
"上移字段"(Pull Up Field)重构手法用于消除子类中的重复字段定义。当多个子类包含相同含义和类型的字段时,将这些字段提升到父类可以集中管理数据存储。
典型代码坏味道
- 多个子类中存在相同名称和类型的字段
- 重复的字段访问方法
- 子类间字段校验逻辑重复
重构步骤
-
识别重复字段
- 找到多个子类中的相同字段定义
- 确认字段的业务含义完全一致
- 检查字段初始化方式的差异
-
在父类中声明字段
- 将字段声明移至父类
- 调整访问修饰符(通常为protected)
- 保持子类现有构造函数不变
-
移除子类字段
- 删除子类中的重复字段声明
- 修改子类中直接访问字段的代码
- 保持子类特有的字段不变
-
验证与测试
- 检查序列化/反序列化影响
- 验证反射操作的兼容性
- 确保数据库映射正确性
示例
重构前:
class Engineer extends Employee {
protected String department;
// 其他字段和方法...
}
class Manager extends Employee {
protected String department;
// 其他字段和方法...
}
重构后:
abstract class Employee {
protected String department;
// 公共字段和方法...
}
class Engineer extends Employee {
// 特有字段和方法...
}
class Manager extends Employee {
// 特有字段和方法...
}
专项练习
基础练习
-
重构车辆类继承体系
class Car extends Vehicle { private String licensePlate; } class Truck extends Vehicle { private String licensePlate; }
进阶练习
-
跨层级字段重构
class SavingsAccount extends Account { protected BigDecimal interestRate; } class CheckingAccount extends Account { protected BigDecimal interestRate; }
代码审查清单
优势验证
- 子类字段重复率降低80%以上
- 字段修改只需在父类进行
- 统一字段校验逻辑
风险提示
- 可能破坏子类序列化版本
- 多继承场景下的字段冲突
- 需要同步修改数据库映射