重构——33以字段取代子类(Replace Subclass with Fields)

简介: 以字段取代子类(Replace Subclass with Fields):你的各个子类的唯一差别只在“返回常量数据”的函数上:修改这些函数,使他们返回超类的某个新增字段,然后销毁子类

以字段取代子类(Replace Subclass with Fields)

你的各个子类的唯一差别只在“返回常量数据”的函数上:修改这些函数,使他们返回超类的某个新增字段,然后销毁子类

一、动机

1、建立子类的目的,是为了增加新特性或变化其行为

2、子类中只有常量函数,实在没有足够的存在价值

二、做法

1、对所有子类使用Replace Constructor with Factory Method

2、如果有任何代码直接引用子类,令它改而引用超类

3、针对每个常量函数,在超类中声明一个final字段

4、为超类声明一个protected构造函数,用以初始化这些新增字段

5、新建或修改子类构造函数,使它调用超类的新增构造函数

6、编译,测试

7、在超类中实现所有常量函数,令它们返回相应的字段,然后将函数从子类中删掉

8、每删除一个常量函数,编译并测试

9、子类中所有的常量函数都被删除后,使用Inline Method将子类构造函数内联到超类的工厂函数中

10、编译,测试

11、将子类删掉

12、编译,测试

13、重复“内联构造函数,删除子类”过程,直到所有子类都被删除

14、简化条件表达式

目录
相关文章
重构——29以数据类取代记录(Replace Record with Data Class)
以数据类取代记录(Replace Record with Data Class):你需要面对传统编程环境中的记录结构;为该记录创建一个“哑”数据对象
1553 0
重构——57字段上移(Pull Up Field)
字段上移(Pull Up Field):两个子类拥有相同的字段;将该字段移至超类
1610 0
重构——18自封装字段(Self Encapsulate Field)
自封装字段(Self Encapsulate Field):你直接访问一个字段,但与字段之间的耦合关系逐渐变得笨拙;为这个字段建立取值/设置函数,并且只以这些函数来访问字段
1837 0
重构——31以子类取代类型码(Replace Type Code with SubClass)
以子类取代类型码(Replace Type Code with SubClass):你有一个不可变的类型码,它会影响类的行为;以子类取代这个类型码
1575 0
重构——19以对象取代数据值(Replace Data Value with Object)
以对象取代数据值(Replace Data Value with Object):你有一个数据项,需要与其他数据和行为一起使用才有意义;将数据项变为对象
1673 0
重构——49以函数取代参数(Replace Parameter with Methods)
以函数取代参数(Replace Parameter with Methods):对象调用某个参数,并将结果作为参数,传递给另一个函数,而接受该参数的函数本身也能够调用前一个函数;让参数接受者去除该项参数,并直接调用前一个参数
1714 0
重构——68以继承取代委托(Replace Delegation with Inheritance)
以继承取代委托(Replace Delegation with Inheritance):你在两个类之间使用委托关系,并经常为整个接口编写许多极简单的委托关系;让委托类继承受托类
1160 0
重构——67以委托取代继承(Replace Inheritance with Delegation)
以委托取代继承(Replace Inheritance with Delegation) 1、某个子类只使用了超类接口中的一部分,或是根本不需要继承而来的数据 2、在子类中新建一个字段用以保存超类;调整子类函数,令它改而委托超类;然后去掉两者之间的继承关系
2224 0
重构——45将查询函数和修改函数分离(Separate Query from Modifier)
将查询函数和修改函数分离(Separate Query from Modifier):某个函数即返回对象状态,又修改对象状态;建立两个不同的函数,其中一个负责查询,另一个负责修改
1867 0