重构-改善既有代码的设计-重新组织数据
重新组织数据相关重构手法
1.Self Encapsulate Field(自封装字段)(你直接访问一个字段,但是字段之间的耦合变得笨拙,为这个字段建立setter getter 并只用函数来访问字段)
2.Replace Data Value with Object(用对象取代数据值)(你有一个数据项,需要和其他数据和行为一起才有意思,那就把数据项变为对象)
3.Change Value to Reference(把值对象改为引用对象,你从一个类衍生出许多彼此相等的实例,希望把他们替换为同一个对象,把这个值对象变为引用对象)
4.Change Reference to value(把引用对象改为值对象 )(你有一个引用对象,很小切不可变,而且不易管理,把他变为一个值对象)
5.Rpplace Aarray with object(以对象取代数组)(你有一个数组,其中的元素各自代表不同的东西,以对象替换数组,对于数组中的每个元素,以一个字段来表示)
6.Duplicate Observed Data(复制”被监视数据“,你有一些领域数据置身于GUI控件中,而领域函数需要访问这些数据。将该数据复制到一个领域对象中建立Observer模式,用于同步领域对象和GUI对象内的重复数据)
7.change unidirectional associarion to bidirectional(把单向关联改为双向关联)(2个类都需要使用对方特性,但其间只有一条单向链接,添加一个反向指针,并修改函数能够同时更新到2条链接)
8.change bidirectional association to unidirectional(把双向关联改为单向关联)(2个类之间有双向关联,但其中一个类如今不再需要另外一个类的特性。去除不必要的关联)
9.replace magic number with sysbolic constant(以字面常量取代魔数)(你有衣蛾字面数值,带有特别含义,创造一个常量,根据其意义为他命名,并将上述的字面值替换为这个常量)
10.encapsulate field(封装字段)(你的类中存在一个public字段,将他申明为private 并且提供相应的访问函数)
11.encapsulate collection(封装集合)(有一个函数返回一个集合,让这个函数返回该集合的一个只读副本,并在这个类中提供添加移除集合元素的函数)
12.replace record with data class(数据类取代记录),比如查询数据库的时候,使用类来替代记录会更好)
13.replace type code with class(类取代类型码),类之中有一个数值类型码,但是它并不影响类 的行为。用一个新的类来替换该数值码)
14.replace type code with subclass (子类取代类型码)(你有一个不可变的类型码他会影响类的行为,子类取代这个类型码)
15.replace type code with state/strategy(state/strategy取代类型码)(你有一个类型码,它会影响类的行为,但你无法通过继承来消除它。以状态对象取代类型码)
做法:在超类中建立一个查询函数用于返回状态码,在每个子类中重写该函数,返回确切的状态码,在原类中建立一个字段,来保存新建的状态对象,调整原类中负责查询类型码的函数,把查询动作转发给状态对象,调整原类中为类型码设置的函数,吧一个恰当的状态对象子类赋值给保存状态对象的那个字段。
16.replace subclass with fields(字段取代子类)(你的各个子类唯一差别只在返回常量数据的函数身上,修改这些函数使他们返回超类中的某个字段,然后销毁子类)