构筑测试体系
- 可靠的测试环境是重构的前提,因为debug在我们的开发中占据了大多数时间。
- 自动化测试对于增量开发非常有利
- 重构的基本技巧是小步前进、频繁测试
重新组织函数
- ExtractMethod
主要需要考虑函数名字和函数体之间的语义距离。另外,更小的函数更容易被复用。 - InlineMethod
如果某些函数其内部的代码和函数名称同样清晰易读,就可以考虑将此函数内联。
另外,重构一个比较散乱的函数的时候,我们也可先将函数调用的其他函数全部内联,而后进行重构。
如果遇到某个函数内联比较麻烦,可能需要考虑是否有必要内联 - Inline Temp
如果临时变量只被某简单表达式赋值一次,考虑内联 - Replace Temp With Query
临时变量有可能会使得我们写的函数更长(这样才能访问到需要的临时变量),会增大复杂度,尽可能减少使用临时变量。(注,不可否认,对于会被多次使用的变量,使用临时变量效率更高。而且减少了函数数目) - Intruduce Explaining Variable
如果我们有一个比较复杂的表达式(特别是条件表达式),此时我们可以考虑使用临时变量来接收此表达式,并用该变量的名字来解释此表达式的用途。(作者更喜欢提取为函数) - Split Temporary Variable
如果有临时变量被赋值超过一次,它既不循环也不搜集计算结果,那么我们针对每一次计算结果都创建一个独立的临时变量。(看到很多代码为了所谓的优化反其道而为之) - Remove Assignments to Parameters
对参数重新赋值容易引起混乱,代码不清晰(类似上一条) - Replace Method with Method Object
如果某函数内部局部变量比较多,很难重构成多个小函数,可以试着尝试使用函数对象。 - Subsitute Algorithm(替换算法)
“重构可以把一些复杂东西分解为较简单的小块”,对于某些算法可以考虑是否有更精简的算法。在替换算法之前我们往往需要先分解算法,因为替换一个巨大而复杂的算法是非常困难的。替换的过程中要注意做好测试,保证算法的一致性。
总结
本章主要介绍一些常见的重构手法,其原则是化繁为简,将复杂的类、算法、函数进行拆分,尽可能的复用逻辑,尽可能的写出清晰易读的代码。
网友评论