读完《重构》,我个人认为重构的精髓在于如何小步前进的去用某个重构手法做重构。比如有个手法是“函数组合成类”,那怎样一步一步的做这个重构确保不会回退是重构的精髓。
这里主要总结重构的手法,关于每种重构手法如何小步迭代的去做,阅读原书即可。
首先书籍《重构》中的关于重构手法的目录,包括以下几节:
1、第一组重构。
2、封装。
3、搬移特性。
4、重新组织数据。
5、简化条件逻辑
6、重构API
7、处理继承关系
现根据书籍《重构》和我的阅读体会,按照变量、函数、类的重构手法进行总结。这样方便每当看到变量、类、函数时能有些重构的念头。
一、变量重构手法总结
(1)变量改名。这个最简单,目的主要是增强可读性。
(2)提炼变量。用变量承担直接调用函数的地方,主要为了使代码结构清晰。如果在函数中多次调用同一个函数且参数值相同,更有必要提炼变量存储函数返回的值。
(3)内联变量。如果变量只存储函数返回的值,不如直接在该处调用函数,省去赋值给临时变量的工作。
(4)封装变量。主要是封装这个变量的读和写。可用于外部写入时进行验证和监控变量的使用情况。封装变量后的目的类似于C#中“属性”的作用
(5)拆分变量。是指不要让同一个变量先后承担两个不同意思的数据表达。比如先用temp表示高度,后边temp被赋值给宽度。这个时候应该再拆出一个变量表达宽度。
(6)以查询取代派生变量。举例来说,如果类中数据成员A最新的值 需要依照其它数据成员B来计算。不要弄成,每次修改B然后去更新A。而是每次获取A时直接根据B来计算。
每次获取A时直接根据B来计算就是这里指的查询。
二、函数重构手法总结
(1)提炼函数。把若干代码整合成一个函数。因为一般函数最好要保持单一职责,函数越小越好,所以提炼函数的目的是精简一个函数的职责。
(2)内联函数。简单说就是把函数直接在调用的地方展开。场景有两个 1、先内联函数,再用新的方式来提炼函数。2、被内联的函数太简单,没有被提炼出函数的必要。
(3)改变函数声明。这个场景不用多说。
(4)函数组合成类。如果若干函数始终形影不离的操作同一块数据,可以考虑把这几个函数整合成一个类。最终可以减少函数的传参,简化函数的调用。
(5)函数组合成变换。
(6)搬移函数。如果某些函数与其它地方的上下文放到一起更合适,就移动过去。
(7)搬移语句到函数。场景是某些语句与函数在一起更像一个整体。把对应代码语句移动到函数里。
(8)以函数调用取代内联代码。其实就是指若干代码语句的调用,考虑是否有现成的函数或库函数来替换。
(9)函数上移。重构继承关系时考虑有些函数是否上移到父类更合适。或者通过在父类添加一个函数来减少子类中一些不必要的重复。
(10)函数下移。重构继承关系时考虑有些函数是否下移到父类更合适。比如父类中的某个函数只与某几个子类有关。
(11)移除设值函数。如果某个字段在构造函数里被设值后,以后不应该再改则应考虑移除对该字段的设置函数。
(12)函数参数化。主要是解决若干函数逻辑相似,但细微处不一致,可以考虑用把这些函数进一步整合成一个函数,
(13)构造函数本体上移。场景是继承体系中子类构造函数中一些工作考虑可以放到父类中。
(14)以工厂函数取代构造函数。解决的场景:1、构造函数名称固定,无法对外提供一个更清晰的函数名。2、构造函数需要特殊的操作符来调用。
(15)以函数取代命令。
(16)以命令取代函数。