用对象替换数据值
问题
一个类(或一组类)包含一个数据字段。字段有自己的行为和相关数据。
解决方案
创建一个新类,将旧字段及其行为放在类中,并将类的对象存储在原始类中。
之前

后

为什么重构
这种重构基本上是一种特殊情况提取类.它的不同之处在于重构的原因。
在提取类,我们有一个单独的类负责不同的事情,我们想要分割它的责任。
通过用对象替换数据值,我们有了一个原始字段(数字、字符串等),由于程序的增长,它不再那么简单,现在有了相关的数据和行为。一方面,这些领域本身并没有什么可怕的。但是,这个字段和行为家族可以同时出现在几个类中,从而产生重复的代码。
因此,对于所有这些,我们创建了一个新类,并将字段和相关数据和行为都移动到它。
好处
- 提高类内部的相关性。数据和相关行为在单个类中。
如何重构
在开始重构之前,请查看类中是否有对字段的直接引用。如果是,请使用自封装字段为了将它隐藏在原始类中。
创建一个新类,并将字段和相关getter复制到它。此外,创建一个接受字段简单值的构造函数。这个类没有setter,因为每个发送到原始类的新字段值都会创建一个新的值对象。
在原始类中,将字段类型更改为新类。
在原始类的getter中,调用关联对象的getter。
在setter中,创建一个新的值对象。如果之前已经在构造函数中为字段设置了初始值,则可能还需要在构造函数中创建一个新对象。
下一个步骤
应用此重构技术后,明智的做法是应用将值更改为Reference在包含对象的字段中。这允许存储对对应于某个值的单个对象的引用,而不是为同一个值存储数十个对象。
当您希望一个对象负责一个实际对象(例如用户、订单、文档等等)时,通常需要使用这种方法。同时,这种方法对于日期、金钱、范围等对象并不有用。