《重构》读书笔记 第八章

2022-08-28  本文已影响0人  dafasoft

重新组织数据

8.1 Self Encapsulate Field (自封装字段)

间接访问变量的好处:

  1. 子类可以通过腹泻一个函数二改变获取数据的途径
  2. 支持更灵活的数据管理方式,如延时初始化

这个重构手法的适用范围:
想访问超类中的一个字段,却又想在子类中将对这个变量的访问改为一个计算后的值

8.2 Replace Data Value With Object (以对象取代数据值)

当某个类中的数据项随着功能扩展越来越多,应该将一些数据和行为一起使用的数据项封装起来

这种情况特别常见,几乎是随着功能扩展出现的必然情况,随之出现的就是重复代码依恋情结这两个代码坏味道。

8.3 Change Value to Reference(将对象改为引用)

这条重构手法在于避免重复创建对象,对于意义完全相同的对象,应该使用同一个值。

手法:
使用工厂模式创建对象,使用集合对创建的对象进行缓存

最近在做的需求中,使用ARouter获取Service的功能,ARouter对Service的处理就是这种手法

但是引申出的问题就是想获取两个不同对象时反而比较麻烦,个人感觉可以在获取对象时添加是否使用缓存对象的选择

8.4 Change Reference to Value(将引用对象改为值对象)

和8.3相反,当我们需要每次都获取不同对象时,使用此手法

8.5 Replace Array with Object (以对象取代数据)

此手法适用于一个数组中,每条数据均代表不同含义的情况

新建一个类表示数据所拥有的信息,逐一为·数组元素添加取值/设值函数,根据元素的用途,为这些函数命名。

此手法的意义在于将意义不明确的数组下标改为有意义的函数名

8.6 Duplicate Observed Data (复制 “被监视对象”)

其实就是将Model层和View层隔离。书中使用观察者模式对View进行更新。

目前Anroid似乎已经有类似 DataBinding LiveData这种更现代的实现

8.7 Change Unidirectional Association to Bidirectional (将单向关联改为双向关联)

两个类都需要使用对方特性,但其间只有一条单向连接。添加一个反向指针,并使修改函数能够同时更新两条链接。

8.8 Change Bidirectional Association to Unidirectional (将单向关联改为双向关联)

两个类之间有双向关联,但其中一个类如今不在需要另一个类的特性。

8.9 Replace Magic Number With Symbolic Constant(以字面常量取代魔法数)

这个好理解,就是代码里不要有魔法数,不好理解

8.10 Encapsulate Field (封装字段)

将public 改为private 提供函数对其访问

8.11 Encapsulate Collection (封装集合)

让这个函数返回改集合的一个只读副本,并在这个类中提供添加,移除集合元素的函数

降低集合拥有者和用户之间的耦合度

目前Gson源码里使用的就是该手法
工程中sonar检测也有该规则

8.12 Replace Record with Data Class (以数据类取代记录)

创建一个类来记录外来数据,如数据库记录等

8.13 Replace Type Code with Class (以类取代类型码)

类之中有一个数值类型码,但它并不影响类的行为
好处: 只要为这个类提供工厂函数,你就可以始终保证只有合法的实力才被创建出来,而且它们都会被传递给正确的宿主对象。

8.14 Replace Type Code with Subclassed(以子类取代类型码)

类中有一个不可变的类型码,但是会影响类的行为,可以用子类的方式取代该类型码,并将影响类行为的代码移动到子类中

8.15 Replace Type Code with State/Strategy(以State/Strategy取代类型码)

有一个类型码,它会影响类的行为,但是无法通过继承去消除它,可以使用策略模式或者状态模式去重构

8.16 Replace Subclass with Fields (以字段取代子类)

当某个类的各个子类的唯一差别只在“返回常量数据“的函数身上,那么就不需要子类化。

上一篇下一篇

猜你喜欢

热点阅读