重构API

1. 将查询函数与修改函数分离

因为查询是没有副作用的,但是修改函数却有可能有副作用。这个也可以引申为将查询函数与响应函数分离。就是在查询函数中将所有可能造成副作用的语句提炼成一个函数。这样需要关心的代码就更少了。

2. 函数参数化

如果多个函数逻辑非常相似,只有一些字面量值不同,那么可以将这些字面量作为参数传入,将多个函数合并成一个。

3. 移除标记参数

标记参数是指,调用者用它来指示被调函数应该执行哪一部分逻辑的参数(影响内部的控制流),而不是为了计算或是赋值。这样的函数参数还需让人弄清有哪些可用的值。枚举型还好,但布尔型值则让人疑惑,false和true到底会在函数中表示什么意思。解决方法是为每一种可能值新建一个明确函数。但如果一个函数有多个标记参数,就不得不保留,不然就得新建 标记参数的排列组合 个新函数。

还有一种情况不能使用移除标记参数的是,如果调用者调用时函数,标记参数是不确定的,比如标记参数是从另一个函数的返回值获取的,并不是直接一直被赋值为“True”。这种情况下如果一定要用移除标记参数,除非用条件语句判断标记参数的值,然后调用对应的函数。

有时候标记参数并不在函数的顶层分发逻辑,比如只在后半部分分发逻辑,这样要剥离成多个新函数可能比较难。那么可以在函数之上,新建两个函数,这两个函数有非常明确的名字,分别用不同的标记参数调用目标函数。如:

funcA(){ C(false); }

funcB(){ C(true); }

4. 保持对象完整性

当发现调用者从一个对象中查询出几个值,再将这几个值作为参数传递给目标函数,那么不要查询,而是将整个对象传过去,让目标函数查询。这样调用者调用函数会更简单。而且能更好地应对变化,万一之后目标函数又需要该对象的其他值了呢?

还有一种情况就是那个对象就是调用者本身,就把this传过去,这也属于本重构的范围。

5. 以查询取代参数

参数列表应尽量保持简洁,避免重复,这样会简化调用方,易于理解。避免重复的意思是,如果参数二能从参数一种查询得出,就删除参数二。

6. 以参数取代查询

5是因为简化调用方,而6则是为了解耦。有时不希望目标函数依赖于某个元素,那么就将目标函数需要的信息查询好,再作为参数传递过去。目标函数不会知道这是谁的信息,只管处理就是。

尽量保持类的不可变。

7. 移除设值函数

当你不希望一个值被改变时,将该值声明为不可变,并且删除设值函数。

对于一些值,需要被初始化,初始化之后就再也不会变了,那么就让它在构造函数中被赋值。

8. 以工厂取代构造函数

这个就是设计模式中的工厂方法,一个工厂方法返回一个对象,设计模式中的工厂方法是为了封装变化,让生成对象这种可能变化的东西(可能生成的是父类,也可能是子类,在运行中才会确定)被封装在工厂方法中。

在重构这本书中,工厂函数的好处也是能根据参数信息返回不同的子类或是代理类。还有一个好处是构造函数的名字可能不如工厂函数的名字清晰。

9. 以命令取代函数

就是设计模式中的命令模式,命令模式将命令作为一个对象而不是函数,这样就可以作为参数传入执行,作为对象存储。而且命令模式中还存在撤销函数,记录函数,可以根据返回执行前的状态。

重构中还提出的一个好处是,如果一系列的操作总是一起进行,并共享状态,那么调用者调用起来就比较麻烦,将他们作为一个命令对象,生成了该对象执行excute方法就相当于执行了这一些列操作。命令对象比较适合复杂计算的情况下,将一个复杂的函数拆解成多个方法。

参传递参数时,最好通过构造函数传递,而不是excute传递。

10. 以函数取代命令

如果你想调用一系列操作中的一个,但是构建调用前的数据状态比较复杂,或者一个函数不是太复杂,那么就没有必要使用命令模式。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值