重构十一:重构API

319 阅读3分钟

本章为第二版的第十一章,就说看的时候总感觉像是在复习,后面就会以第二版的来更新了,相比第一版,去掉了大型重构章节,作者的解释是比较复杂,那就先不看了吧

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)

  • 和第九条相反,如果命令对象中的函数逻辑较为简单,则可将命令函数通过提取函数的手法提取出来 \