第8章 重新组织数据(暂略)
自封装字段(Self Encapsulate Field)
其实现在有了Spring框架,支持插件lombok,直接添加注释@Data即可完成封装
(略...)
以对象取代数据值(Replace Data Value with Object)
其实就是我们平时常用的手法,即将类中散落的数据封装成一个自定义类型的数据,举个例子:
如果一个类里需要数据值有水果品种,单价,重量,总金额,那么就把这四个数据封装成一个类就好。
将值对象改为引用对象(Change Value to Reference)
1.动机:
当一个类衍生出许多相等的实体时,你希望将它们替换成单一对象,就将这个实体对象变成一个引用对象。
2.区分:
实体和引用,一个类能实例出很多不同的实体对象,而引用是实例出一个后,以后再调用这个类就直接等于了之前实例出的那个对象(指向了最初的实例对象)。
将引用对象改为值对象(Change Reference to Value)
1.动机:
你有一个引用对象,很小且不可变,而且不易管理,将它变成一个值对象。
略。。
以对象取代数组(Replace Array with Object)
1.动机:
你有一个数组,其中的元素各自表示不同的东西,那么就以对象替换数组,对于数组中的每个元素,以一个字段来表示。
复制“被监视数据”(Duplicate Observed Data)
略。。
将单向关联改为双向关联(Change Unidirectional Association to Bidirectional)
略。。
将双向关联改为单向关联(Change Bidirectional Association to Unidirectional)
略。。
以字面常量取代魔法值(Replace Magic Number with Symbolic Contant)
1.概念:
创造一个常量,根据其意义为它命名,并将上述的字面数值替换为这个常量。
2.举例:
static final double AMOUNT = 9.99;
3.造成的坏味道:
一旦这个数字修改,就要将所有地方引用到这个数字的地方修改一遍,多以换成常量很有必要。
封装字段(Encapsulate Field)
1.概念:
你的类中存在一个public字段,将它声明为private,并提供相应的访问函数。
2.动机:
数据隐藏。
封装集合(Encapsulate Collection)
1.概念:
有个函数返回一个集合,让这个函数返回该集合的一个只读副本,并在这个类中提供添加/移除集合元素的函数。
2.动机:
我们通常会在一个类中使用集合(collection, array, list...)来保存一组实例,这样的类通常也会提供针对集合的取值/设置函数。但集合的处理方式和其他种类的数据略有不同,取值函数不该返回集合自身,因为这会让用户得以修改集合内容而集合拥有者却一无所知,也会暴露过多对象内部数据结构的信息,所以一是需要隐藏对象内与用户无关的数据结构,二是应该为集合添加/移除元素的函数。
略。。
以数据类取代记录(Replace Record with Data Class)
1.概念:
你需要面对传统编程环境中的结构记录,为该记录创建一个“哑”数据对象。
略。。
以类取代类型码(Replace Type Code with Class)
略。。
以子类取代类型码(Replace Type Code with Subclasses)
以State/Strategy取代类型码(Replace Type Code with State/Strategy)
以字段取代子类(Replace Subclass with Fields)