重构——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、简化条件表达式

目录
相关文章
|
1月前
|
Java 开发者
JDK 21中的记录模式(Record Patterns):简化对象匹配与解构
本文将详细介绍JDK 21中引入的新特性——记录模式(Record Patterns)。记录模式是一种强大的语言特性,它允许开发者在switch表达式中使用简化的语法来匹配和解构记录类型(record types)。本文将解释记录模式的概念、语法、使用场景以及与传统模式匹配的区别,并通过示例代码展示记录模式在实际开发中的应用。
重构——29以数据类取代记录(Replace Record with Data Class)
以数据类取代记录(Replace Record with Data Class):你需要面对传统编程环境中的记录结构;为该记录创建一个“哑”数据对象
1531 0
重构——57字段上移(Pull Up Field)
字段上移(Pull Up Field):两个子类拥有相同的字段;将该字段移至超类
1579 0
重构——18自封装字段(Self Encapsulate Field)
自封装字段(Self Encapsulate Field):你直接访问一个字段,但与字段之间的耦合关系逐渐变得笨拙;为这个字段建立取值/设置函数,并且只以这些函数来访问字段
1813 0
重构——31以子类取代类型码(Replace Type Code with SubClass)
以子类取代类型码(Replace Type Code with SubClass):你有一个不可变的类型码,它会影响类的行为;以子类取代这个类型码
1554 0
重构——19以对象取代数据值(Replace Data Value with Object)
以对象取代数据值(Replace Data Value with Object):你有一个数据项,需要与其他数据和行为一起使用才有意义;将数据项变为对象
1653 0
重构——49以函数取代参数(Replace Parameter with Methods)
以函数取代参数(Replace Parameter with Methods):对象调用某个参数,并将结果作为参数,传递给另一个函数,而接受该参数的函数本身也能够调用前一个函数;让参数接受者去除该项参数,并直接调用前一个参数
1689 0
重构——27封装字段(Encapsulate Field)
封装字段(Encapsulate Field):你的类中存在一个public字段:将它声明为private,并提供相应的访问函数
1283 0
重构——67以委托取代继承(Replace Inheritance with Delegation)
以委托取代继承(Replace Inheritance with Delegation) 1、某个子类只使用了超类接口中的一部分,或是根本不需要继承而来的数据 2、在子类中新建一个字段用以保存超类;调整子类函数,令它改而委托超类;然后去掉两者之间的继承关系
2134 0
重构——68以继承取代委托(Replace Delegation with Inheritance)
以继承取代委托(Replace Delegation with Inheritance):你在两个类之间使用委托关系,并经常为整个接口编写许多极简单的委托关系;让委托类继承受托类
1135 0