重构--重构的迹象

  1. 神秘命名
    issue:意义不明、具有二义性的函数声明、变量、类名等。

    resolve:改名,采用有意义的词语。

  2. 重复代码
    issue:存在多段相同的代码结构。

    resolve:提炼出重复的代码,并调用提炼的代码。

  3. 过长函数
    issue:一个函数内实现两种以上的功能。

    resolve:尽可能的分解函数,一个函数只做一件事。

  4. 过长参数列表

    issue:

    • 函数的参数超过三个,有几个参数总是同时出现。
    • 从现有数据结构中抽出很多数据项。
    • 区分函数行为的参数。
    • 多个函数有同样的几个参数。

    resolve:

    • 将参数合并成一个参数对象。
    • 保持对象完整,传入原来的数据结构。
    • 移除标记参数。
    • 使用函数组合成类,将共同的参数变成类的字段。
  5. 全局数据
    issue:代码的任何一个地方都可以对齐更改,而且没有机制可以探测出那段代码做出了修改。

    resolve:封装变量。使用函数将全局数据包装起来,并控制对它的访问。最好将这个函数及其封装的数据移到一个类或模块中,只允许模块内的代码使用它,从而尽量控制器作用域。

  6. 可变数据
    issue:对数据的修改经常导致出乎意料的结果和难以发现的BUG。

    resolve:

    1. 封装变量
    2. 拆分变量:将其拆分成各自不同用途的变量,从而避免危险的更新操作。
    3. 提炼函数:尽量把逻辑从处理更新操作的代码中移出来,将没有副作用的代码与执行数据更新操作的代码分开。
    4. 如果一个变量在其内部结构中包含了数据,最好不要直接修改其中的数据,而是将引用对象改为值对象,令其直接替换整个数据结构。
  7. 发散式变化
    issue:某个模块经常因为不同的原因在不同的方向上发生变化。如新加入一个工具,需要修改4个函数,新加入一个数据库,需要修改3个函数。

    resolve:拆分函数、提炼函数,将不同的逻辑分开。

  8. 霰弹式修改
    issue:每遇到某种变化,你都必须在许多不同的函数或类内做出许多小修改。

    resolve:把所有需要修改的代码放在同一个模块中,把本不该分散的逻辑聚合到一处。

  9. 依恋情结
    issue:一个函数与另一个模块中的函数或数据交流十分频繁,远多于在自己所处模块内部的交流。

    resolve:

    1. 如果函数中只有一部分存在这种情况就提炼函数。
    2. 判断哪个模块拥有此函数使用的数据最多,让后就把这个函数和那些数据摆在一起。
  10. 数据泥团
    issue:两个类中相同的字段、许多函数签名中相同的参数。

    resolve:将相同的字段使用提炼类方法将他们提炼到独立对象中。运用引入参数对象或保持对象完整缩短参数列表,简化函数调用。

  11. 基本类型偏执
    issue:不创建对问题域有用的基本类型,如钱、坐标、范围等。会存在计算物理量时无视单位的情况以及大量类似 if(a<upper && a>lower) 这样的代码。

    resolve:以子类取代类型码,以多态取代条件表达式。

  12. 重复的switch
    resolve:以多态取代条件表达式。

  13. 冗余的元素
    resolve:使用内联函数或内联类、折叠继承体系。

  14. 夸夸奇谈通用性
    issue:过分的追求函数或类的通用性是没有必要的,这么做往往会使系统更难理解和维护。

    resolve:去掉用不到的多余的函数或功能。

  15. 临时字段
    issue:某个类内部的某个字段仅为某种特定的情况而设。在这个字段未使用时,很难知道它的作用。

    resolve:将所有和这个字段相关的代码单独提炼出来成为一个类。

  16. 过长的消息链
    issue:客户端代码将与查找过程中的导航结构紧密耦合。一旦对象间的关系发生变化,客户端就不得不做出相应修改。

    resolve:观察消息链最终得到的对象是用来做什么,看能否以提炼函数把使用该对象的代码提炼到一个独立的函数中,在将函数推入消息链。

  17. 中间人
    issue:过渡运用委托。

    resolve:移除中间人,直接和真正负责的对象交流。

  18. 过大的类
    issue:单独的类做太多事情,其内部往往会出现太多字段,重复代码就会出现。

    resolve:提炼类、提炼超类

  19. 纯数据类
    issue:纯数据类指拥有一些字段,以及用于访问这些字段的函数,除此之外一无长物。

    resolve:封装类,并将那些调用行为移入到纯数据类中。

  20. 被拒绝的遗赠
    issue:子类复用了超类的行为,却不支持超类的接口。

    resolve:使用委托取代子类或超类

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值