重构读书笔记-8总结
重构第八章
总结
本章主要解决的是数据之间的存在关系。
1.Self Encapsulate Field(自封装值域):这个重构比较简单,就是为了通过间接访问函数来访问数据,目的是为了解耦。
2.Replace Data Value With Object(以对象取代数据值):是面向对象语言很有用的一个特征,可以使哑数据,变成有动作的对象。同时能使得class职责单一。
3.Change Value to Reference(将实值对象改为引用对象)当一个class,拥有很多相同的实体的时候,使用这项重构方法,将其变成reference object。
4.Change Reference to Value(将引用对象改为实值对象):和Change_Value_to_Reference(将实值对象改为引用对象)方法作用相反,目的是将小的切不易管理的reference class替换为value class。
5.Replace Array with Object(以对象取代数组):当一个数组很像一个数据结构的时候,使用这项手法。
6.Duplicate Observed Data(复制[被监视数据]):GUI classes需要处理业务逻辑的时候,将这些业务逻辑的行为移到合适的domain class中,同时在domain class中保留逻辑的相关数据。
7.Change Unidirectional Association to Bidirectional(将单向关联改为双向):单向连接比较简单,但是有时候为了功能的丰富,可能需要通过这个手法,改为双向连接。
8.Change Bidirectional Association to Unidirectional(将双向关联改为单向):双向连接比较复杂,可能不在需要某些连接时,通过这个手法消除掉连接。
9.Replace Magic Number With Symbolic Constant(以符号常量/字面常量取代魔法数):魔法数是有特殊含义的一组数字,需要弄清魔法数的含义需要使用这个手法。
10.Encapsulate Field(封装值域):Encapsulate Field(封装值域)的手法和Self Encapsulate Field(自封装值域)很相似,不过前者的目的是为了封装,后者是为了解耦。
11.Encapsulate Collection(封装群集):这个手法和Encapsulate Field(封装值域)手法的区别是前者暴露的是单个数据,后者暴露的是整个群集。
12.Replace Record With Data Class(以数据类取代记录):用class代替数据,Replace Array with Object(以对象取代数组)是这种手法的一个特殊版本。
13.Replace Type Code With Class(以类取代型别码):类型码用来表示信息,不会改变所属class的行为。
14.Replace Type Code With Subclasses(以子类取代型别码):类型码会改变所属class的行为。
15.Replace Type Code with State/Strategy(以state/strategy取代型别码):类型码会改变所属class的行为,但无法使用Replace Type Code With Subclasses(以子类取代型别码)手法时,使用这个手法
16.Replace Subclass with Fields(以值域取代子类):和Replace Type Code With Subclasses(以子类取代型别码)手法相反,当子类唯一差别就只在[返回常量数据]的函数上时,使用这个手法。
读书第一遍重构思路
本章中有几个方法是对立的,所以我们可以看出,在实际生活中,重构是一个动态的过程,不存在一次就可以重构成功。
重构的方法改变,往往是伴随着需求的改变和代码量的累积的。
[Self Encapsulate Field(自封装值域)]、[Encapsulate Field(封装值域)]、[Encapsulate Collection(封装群集)]三个方法,都是将值域、群集进行封装的方法,前两者差别在于目的性不同,后两者在于封装的值域不同。
[Replace Data Value With Object(以对象取代数据值)]、[Replace Array with Object(以对象取代数组)]、[Replace Record With Data Class(以数据类取代记录)]这三个方法分别通过class代替数值、数组和记录,[Replace Data Value With Object(以对象取代数据值)]将复杂数据独立称为一个class;[Replace Array with Object(以对象取代数组)]保证了数组只代表序号不同的一类物体;[Replace Record With Data Class(以数据类取代记录)]是最基础的代替类,上面两种都是第三种的特化。
[Replace Type Code With Class(以类取代型别码)]、[Replace Type Code With Subclasses(以子类取代型别码)]、[Replace Type Code with State/Strategy(以state/strategy取代型别码)]都是通过
class来替代型别码。[Replace Type Code With Class(以类取代型别码)]是当型别码和class的特性无关时使用的;[Replace Type Code With Subclasses(以子类取代型别码)]是在型别码影响到类的特性时使用;[Replace Type Code with State/Strategy(以state/strategy取代型别码)]更加灵活,是在无法使用子类替换型别码的时候使用的。
[Change Value to Reference(将实值对象改为引用对象)]和[Change Reference to Value(将引用对象改为实值对象)]还有[Change Unidirectional Association to Bidirectional(将单向关联改为双向)]和[Change Bidirectional Association to Unidirectional(将双向关联改为单向)]是相辅相成的两组重构方法,他们可以动态的调成class的关系。
[Duplicate Observed Data(复制[被监视数据])]使用在含有界面的程序中中,可以使得业务和界面分离。
[Replace Magic Number With Symbolic Constant(以符号常量/字面常量取代魔法数)]是去除无法理解的字面常量的好方法。
[Replace Subclass with Fields(以值域取代子类)]是[Replace Type Code With Subclasses(以子类取代型别码)]的方向重构,减少subclass的个数。
注意
重构必须在有单元测试的情况下,保证之前的功能修改后不收影响。切记!!!