《重构》读书笔记
代码的坏味道
-
当你感觉需要攥写注释的时候,请先尝试重构,试着让注释变得多余。
-
重复代码(Duplicated Code)
同一个类的两个函数有相同的表达式两个互为兄弟的子类内含相同的表达式 ==> 提解到超类中去两个毫不相关的类出现重复代码 ==> 放到第三个类,用一个静态方法,或者放入其中一个类,另一个类调用它即可,看具体详情
- 过长的函数(Long Method)
每当感觉需要以注释来说明点什么的时候,我们就把需要说明的东西写进一个独立函数中,并以其用途(而非实现手法)来命名。如果函数内有大量的参数和临时变量,他们会对你的函数提炼形成阻碍。传递临时变量给新函数,导致可读性是非常的差的。此时你可以 把临时变量放到子函数中去,最终需要的变量,return回来即可条件表达式和循环也是提炼的信号。 都可以提炼到一个独立函数中,并且以良好的命名来说明用途
-
过大的类 (Large Class)
如果单个类做的事情太多,类内有太多的代码,也是代码重复,混乱并最终走向死亡的源头。按照职责拆分类。比如,先确定客户端如何使用他们,然后清除了解这个类,在进行分解
-
过长的参数列 (Long Parameter List)
太长的参数会造成前后不一致,不易使用,而且难以理解此时,你需要把过长的参数封装到一个对象中去,这样就十分的方便了此对象一般叫做VO,或者xxxxRequest 看个人
重新组织函数
-
提炼函数 (Extract Method)
如果一个函数非常的长,那么把其中逻辑一样的部分提炼出来。比如一个简单的循环打印并且计算sum的函数printTest();int res = getRes();但对于有临时变量的,这个是特别的注意。传参,还有返回值,这十分的谨慎琢磨。
-
引用解释性变量 (Introduce Explaining Variable)
你可以用这项重构将每个条件子句提炼出来,以一个良好的命名的临时变量来解释对应条件子句的意义总感觉可用可不用
- 移除对参数的赋值 (Remove Assignments to Parameters)
代码对一个参数(传进一个函数的参数)赋值,是非常不友好的做法。所以请以一个临时变量取代该参数的位置
-
以函数对象取代函数 (Replace Method with Method Object)
如果一个函数之中局部变量泛滥成灾,那么想分解这个函数是非常困难的,有时你会发现根本无法拆解一个需要拆解的函数。这种情况,你就需要函数对象这件法宝了。将这个函数变为对象,函数的局部变量变为函数对象的字段。在新类里面建立一个 compute 的函数,然后使用分解函数进行重构即可
重新组织数据
-
以对象取代数据值 (Replace Data Value with Object)
比如:一开始你可能会用一个字符串来表示 “电话号码” 的概念,但是随后你就会发现,电话号码需要 “格式化”, “抽取区号” 之类的特殊行为。对这个 “电话号码” 你有很多的操作,这是非常不友好的。所以必要时,将 String phone ==> Phone phone 一个对象