《重构》阅读笔记

第3章 代码的坏味道

3.1 (P76)Duplicated Code(重复代码)

  • 同个类两个函数存在相同表达式:Extract Method(提炼函数)
  • 互为兄弟类内存在相同表达式:
    • Extract Method→PullUp Method(函数上移)
    • 如果代码只是相似:先运用Extract Method(提炼函数)分开再Form TemPlate Method(塑造模板函数)
  • 两个毫不相干的类存在重复代码:Extract Class(提炼类)

3.2 (P76)Long Method(过长函数)

原则:尽量利用函数名称来解释用途,而不是注释。
关键:代码主要用来描述“做什么”,而不是描述“怎么做”。例如:getAge()表达获取年龄,而today-birthday就增加了理解的间接性,虽然看代码的人也能明白含义,但是就需要多想一下,并且birthday有可能表达的不是某个人的出生日期呢,而是某个买回来的产品的呢?那可能表达的就是使用时长了。
具体情况:

  • 函数有大量参数和临时变量:Extract Method(提炼函数)
  • 用Replace Temp with Query(以查询取代临时变量)消除临时变量
  • 用Introduce Parameter Object(引入参数对象)或者Preserve Whole Object(保持对象完整)来将多长的参数列表变得简洁一点。
  • 如果按照上述步骤还存在太多变量和参数就需要用到Replace Method with Method Object(以函数对象取代函数)
  • 条件表达式可以用Decompose Conditional(分解条件表达式)解决
  • 可以将循环内的代码提炼为函数。

3.3 (P78)Large Class(过大的类)

有时候类并非在所有时刻都使用实例变量:使用Extract Method和Extract Subclass(提炼子类)

类中有太多代码:

  • Extract Class(提炼类)
  • Extract Subclass(提炼子类)
  • Extract Interface(提供接口)分解类的行为。存在GUI的时候,可以Duplicate Observed Data(复制“被监视数据”),分离数据和行为到业务模型中去。

3.4 (P78)Long Parameter List(过长参数列)

  • 如果可以调用已有对象获取的话可以使用Replace Parameter with Methods(以函数取代参数)
  • 将来自同一对象的数据收集起来,以该对象替代:Preserve Whole Object(保持对象完整)
  • 如果几个参数总是同时出现,那么可以考虑Introduce Parameter Object(引入参数对象)

3.5 (P79)Divergent Change(发散式变化)

不同的变化影响着相同的类发生改变,即变化的认知有分歧(Divergent)。通过Extract Class把不同的功能封装到不同的类中,使每个类只因一种变化而需要修改

3.6 (P80)Shotgun Surgery

相同的变化会涉及到多个类发生修改
可以通过Extract Method,Move Method,Inline Class把一种变化产生的多个修改移到同一个类中。

对比:

    • Divergent Change是一个类受到的多个变化影响;
    • Shotgun Surgery是一个变化引起多个类需要修改。
posted @ 2021-12-05 16:19  马梦佳  阅读(56)  评论(0编辑  收藏  举报