《重构》读书笔记

代码的坏味道

  • 当你感觉需要攥写注释的时候,请先尝试重构,试着让注释变得多余。
  • 重复代码(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 一个对象

 

 

 

posted @ 2021-03-06 15:58  程序员博博  阅读(146)  评论(0编辑  收藏  举报