本章为第二版的第十一章,就说看的时候总感觉像是在复习,后面就会以第二版的来更新了,相比第一版,去掉了大型重构章节,作者的解释是比较复杂,那就先不看了吧
1. 将查询函数和修改函数分离(Separate Query from Modifier)
- 如果遇到一个“既有返回值又有修改的函数”,尝试将查询和修改分离出来
2.函数参数化(Parameterize Function)
- 如果两个函数逻辑非常相似,只是一些字面量值不同,可以将其合并为一个函数,以参数的形式传入不同的值,从而取消重复
3.移除标记参数(Remove Flag Argument)
- “标记参数”是这样一种参数:调用者用它来指示被调函数应该执行哪一部分逻辑。
- 对于标记值,读函数时必须了解标记参数有哪些可用的值,阅读体验非常糟糕。(常见的有枚举,布尔,符号字符)
- 使用分解条件表达式手法时,只有当根据参数做分发的逻辑发生在函数最外层(或者可以比较容易的将其重构之函数最外层)时才去使用
- 使用包装函数来包装带有标记值的函数
4.保持对象完整(Preserve Whole Object)
- 从一个对象中抽取几个值,单独对这几个值做某些逻辑操作,这是一种代码坏味道(依恋情节)
- 如果基础代码都在使用对象的一部分功能,可能意味着应该用提炼类把这一部分功能单独提炼出来
5. 以查询取代参数(Replace Parameter with Query)
- 参数列表越短越容易理解
- 如果调用函数时传入了一个值,而这个值函数本身也可以很容易的获取,则可以考虑去掉这个参数,在函数内部使用此函数的地方直接调用方法获取
6.以参数前取代查询(Replace Query with Parameter)
- 将处理引用关系的责任转交给函数调用者
- 引用透明性:函数的返回值只依赖于其输入值;不透明性:可能会受到全局变量,输入文件,类的成员变量等诸多因素的影响
- 把不具有透明性的元素变成参数传递,函数就能获得透明性,这也是此项重构的目的
7.移除设值函数(Remove Setting Method)
- 字面意思,去除set设值函数
- 老实说这个重构手法在我的开发中基本没有用到过,都是@Data直接放上去,不用特意去关注函数的set方法
- 如果真的不想让对象值改变的话,其实可以在get参数时,如果是对象参数,返回他的clone值。
8.以工厂函数取代构造函数(Replace Constructor with Factory Function)
- 顾名思义,没什么讲的
9.以命令取代函数(Replace Function with Command)
- 此处的命令其实就是一个对象,将所需的字段放在构造函数中,将函数封装在对象中,方便调用
- 只针对比较复杂的函数时使用,更多时候还是以函数方式比较方便
10.以函数取代命令(Replace Command with Function)
- 和第九条相反,如果命令对象中的函数逻辑较为简单,则可将命令函数通过提取函数的手法提取出来 \