代码的坏味道(11)——霰弹式修改(Shotgun Surgery)

时间:2023-03-09 02:13:24
代码的坏味道(11)——霰弹式修改(Shotgun Surgery)

坏味道——霰弹式修改(Shotgun Surgery)

霰弹式修改(Shotgun Surgery) 类似于 发散式变化(Divergent Change) ,但实际上完全不同。发散式变化(Divergent Change) 是指一个类受多种变化的影响。霰弹式修改(Shotgun Surgery) 是指多种变化引发多个类相应的修改。

特征

任何修改都需要在许多不同类上做小幅度修改。

代码的坏味道(11)——霰弹式修改(Shotgun Surgery)

问题原因

一个单一的职责被拆分成大量的类。

解决方法

  • 运用搬移函数(Move Method)搬移字段(Move Field) 来搬移不同类中相同的行为到一个独立类中。如果没有适合存放搬移函数或字段的类,就创建一个新类。
  • 通常,可以运用 将类内联化(Inline Class) 将一些列相关行为放进同一个类。

代码的坏味道(11)——霰弹式修改(Shotgun Surgery)

收益

  • 更好的代码组织
  • 减少重复代码
  • 更易维护

代码的坏味道(11)——霰弹式修改(Shotgun Surgery)

重构方法说明

搬移函数(Move Method)

问题

你的程序中,有个函数与其所驻类之外的另一个类进行更多交流:调用后者,或被后者调用。

代码的坏味道(11)——霰弹式修改(Shotgun Surgery)

解决

在该函数最常引用的类中建立一个有着类似行为的新函数。将旧函数变成一个单纯的委托函数,或是旧函数完全移除。

代码的坏味道(11)——霰弹式修改(Shotgun Surgery)

搬移字段(Move Field)

问题

在你的程序中,某个字段被其所驻类之外的另一个类更多地用到。

代码的坏味道(11)——霰弹式修改(Shotgun Surgery)

解决

在目标类新建一个字段,修改源字段的所有用户,令他们改用新字段。

代码的坏味道(11)——霰弹式修改(Shotgun Surgery)

将类内联化(Inline Class)

问题

某个类没有做太多事情。

代码的坏味道(11)——霰弹式修改(Shotgun Surgery)

解决

将这个类的所有特性搬移到另一个类中,然后移除原类。

代码的坏味道(11)——霰弹式修改(Shotgun Surgery)

引申阅读

欢迎继续阅读 代码的症与药 系列文章。