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

目录
相关文章
|
6月前
|
Java 开发者
JDK 21中的记录模式(Record Patterns):简化对象匹配与解构
本文将详细介绍JDK 21中引入的新特性——记录模式(Record Patterns)。记录模式是一种强大的语言特性,它允许开发者在switch表达式中使用简化的语法来匹配和解构记录类型(record types)。本文将解释记录模式的概念、语法、使用场景以及与传统模式匹配的区别,并通过示例代码展示记录模式在实际开发中的应用。
重构——29以数据类取代记录(Replace Record with Data Class)
以数据类取代记录(Replace Record with Data Class):你需要面对传统编程环境中的记录结构;为该记录创建一个“哑”数据对象
1559 0
重构——57字段上移(Pull Up Field)
字段上移(Pull Up Field):两个子类拥有相同的字段;将该字段移至超类
1626 0
重构——18自封装字段(Self Encapsulate Field)
自封装字段(Self Encapsulate Field):你直接访问一个字段,但与字段之间的耦合关系逐渐变得笨拙;为这个字段建立取值/设置函数,并且只以这些函数来访问字段
1847 0
|
数据库
见到了“公司”定义一个Company类,那么见到了“字段”是不是也可定义一个Column类?
  既然见到了公司,我们可以定义一个Class Company ,那么我们见到了字段,是不是也可以定义一个Class ColumnInfo呢?   公司的描述信息类: 代码 public class Company     {         public int Comp...
894 0
重构——31以子类取代类型码(Replace Type Code with SubClass)
以子类取代类型码(Replace Type Code with SubClass):你有一个不可变的类型码,它会影响类的行为;以子类取代这个类型码
1583 0
重构——19以对象取代数据值(Replace Data Value with Object)
以对象取代数据值(Replace Data Value with Object):你有一个数据项,需要与其他数据和行为一起使用才有意义;将数据项变为对象
1677 0
重构——22以对象取代数组(Replace Array with Object)
以对象取代数组(Replace Array with Object):你有一个数组,其中的元素各自代表不同的东西;以对象替换数组。对于数组中的每个元素,以一个字段来表示
1121 0
重构——49以函数取代参数(Replace Parameter with Methods)
以函数取代参数(Replace Parameter with Methods):对象调用某个参数,并将结果作为参数,传递给另一个函数,而接受该参数的函数本身也能够调用前一个函数;让参数接受者去除该项参数,并直接调用前一个参数
1725 0
重构——16引入外加函数(Introduce Foreign Method)
引入外加函数(Introduce Foreign Method):你需要为提供服务的类增加一个函数,但你无法修改这个类;在客户端建立一个函数,并以第一参数形式传入一个服务类实例
1643 0