【前言】
代码重构对于维护程序的可读性和系统的健壮性具有重要意义。今天有幸阅读这本书,从一个简单案例(影片出租店的账单打印)的单一方法的角度了解单元测试的重要性、函数分解的详细思路的与内联变量移除的具体方法。
【内容概述】
一、重构的前置条件——单元测试
重构前,需要先检查自己是否有一套单元测试作为bug检测器。该测试未必需要特别高级的运行逻辑,但必须具备自原有业务逻辑的我检验能力,以避免重构时程序员可能发生的错误。
二、函数分解——提炼函数
函数的分解本身其实就是代码重构的主题内容,内联变量的移除本身也属于函数分解的一部分。
在整个账单打印的业务逻辑中,最复杂的业务是判断客户所点的影片类型,再进行相应的费用计算。这一块在代码中也是一块巨大的switch分支,将这块业务逻辑提炼成一个函数。这块逻辑并不复杂,但函数提炼完成后,主业务直接调用该方法,便会因参数传递和返回值读取产生很多的内联变量。
如何删除这些内联变量就是业务重构的核心。
三、函数分解——内联变量移除
在案例中,内联变量的移除是一个循环往复的过程。需要注意的是在函数提炼完成、以及每个内联变量移除后记得要执行单元测试并进行签入提交。
参数和返回值内联变量的移除是两个截然不同的逻辑。参数通常需要通过一些逻辑获取,有的只是简单的索引器,有的则需要计算获取,这些实参的计算逻辑通常也可以提炼成一个函数,再进行内联变量的移除。
返回值类型的内联变量最关键的问题就是在主业务中的声明和调用。作者提供的解决方案是:一、去掉主业务中的返回值变量声明,二、在每个调用该变量的地方重复调用分解后的函数。
在整个内联变量的移除过程中,观众积分总和的处理逻辑无疑是最复杂的,因为它需要在循环体中累加得到。将这个变量移除总共分四步:第一步,将积分总和的计算逻辑从原有的循环体中剥离,在算完总金额之后再次循环进行积分计算。第二部,将费用循环计算的逻辑进行函数提炼,这就是一个函数提炼的过程。再往后就是内联变量的移除过程。
【技能提炼】
1、重构的过程就是反复进行函数提炼和内联变量移除的过程。
2、内联变量的移除方法:
(1)将变量的计算逻辑分离
(2)进行函数提炼
(3)去掉变量声明
(4)使用时重复调用提炼函数
【过程反思】
性能问题无疑是整个过程中最令人担忧的问题,毕竟同一个方法在每个使用的地方都要重复调用。作者的建议是先完成重构,再进行性能优化。