1. 提炼函数
当你想为接下来的一段代码写点注释时,那么这就暗示着,这段代码应该被提炼成一个函数,这个函数的名字应该是函数的功能,是做什么,而不是这么做,一般你想写什么注释,名字就重注释中抽取关键词。当遇到循环、条件等语句,可以将它们提炼成一个函数。
提炼函数的目的是将意图与实现相分离。所以一般有个主函数,里面调用其他的函数,这个主函数包含的就是意图,其他函数就是实现。
提炼函数时,如果要返回多个值,则考虑将这多个值组合成一个对象,不过一般都是一个函数最多返回一个值。
2. 内联函数(不是内部函数)
什么时候需要内联函数呢?
当函数内容与其名称一样清晰易于理解时;
当一群函数组织不太合理,则先合再分;
过多的委托层。
3. 将表达式提炼成变量
有时,将表达式提炼成变量,能更好地理解代码的含义。
而且也不需要重复地写表达式。
如果一个变量的作用域是一个对象,则将表达式提炼成一个方法。
4. 内联变量
如果表达式比变量更具表现力,则用表达式代替变量。
5. 改变函数声明
取一个准确的名字
参数的范围:是需要一个人,还是只需要一个人的年龄
改函数声明时,如果有其他人负责的模块会调用这个接口,则先写另一个声明,将原函数设为不推荐,在原函数中调用新函数。一段时间后,等客户端都使用了新函数,就将就函数删除。
6. 封装值
之前的重构只是控制数据结构的访问,封装值则限制外部修改值。当外部需要访问一个数据时,返回它的副本,这样即使修改了,也不会影响原来的数据。但有时外部就是需要更改原来的数据,要注意分辨。越是使用范围广的数据,越是需要一个封装函数。
7. 变量改名
给变量取一个准确的名字
8. 引入参数对象
当你发现一组数据总是在一起作为参数出现(数据泥团),这说明这一组有着某种关系,创建一个类,将它们移动到类中。
这么做往往会催生代码更深层次的改变,你可以把涉及这些数据而较少涉及其他数据的方法也移到该类中,这样软件的结构就更清晰。
9.函数组合成类
如果发现一组函数形影不离地操作同一数据块,就为它们及数据创建一个类。
10. 函数组合成变换
计算派生数据的逻辑收拢到一处,组合成变换。
这和9非常像,但是类中的方法会更新源数据,变换则不会,而是根据源数据计算新数据,保存新数据。
虽然在java、c#中只有类的概念。
11. 拆分阶段
当看见一段代码在做两件不同的事,就拆分成两个方法,每一个方法应该都有明确的边界。如果一块代码中出现的几段,它们分别使用不同的一组数据和方法,这就是需要拆分的明显线索。
如果第二个方法要用到第一个方法的结果数据(有多个),将这些数据作为一个结构体(如果类型相同,就返回数组),传递给方法二。