代码的坏味道(9)——异曲同工的类(Alternative Classes with Different Interfaces)

坏味道——异曲同工的类(Alternative Classes with Different Interfaces)

特征

两个类中有着不同的函数,却在做着同一件事。

代码的坏味道(9)——异曲同工的类(Alternative Classes with Different Interfaces)

问题原因

这种情况往往是因为:创建这个类的程序员并不知道已经有实现这个功能的类存在了。

解决方法

  • 如果两个函数做同一件事,却有着不同的签名,请运用 函数改名(Rename Method) 根据它们的用途重新命名。
  • 运用 搬移函数(Move Method)添加参数(Add Parameter)令函数携带参数(Parameterize Method) 来使得方法的名称和实现一致。
  • 如果两个类仅有部分功能是重复的,尝试运用 提炼超类(Extract Superclass) 。这种情况下,已存在的类就成了超类。
  • 当最终选择并运用某种方法来重构后,也许你就能删除其中一个类了。

收益

  • 消除了不必要的重复代码,为代码瘦身了。
  • 代码更易读(不再需要猜测为什么要有两个功能相同的类)。

代码的坏味道(9)——异曲同工的类(Alternative Classes with Different Interfaces)

何时忽略

  • 有时合并类是不可能的,或者是如此困难以至于没有意义。例如:两个功能相似的类存在于不同的lib库中。

重构方法说明

函数改名(Rename Method)

问题

函数的名称未能恰当的揭示函数的用途。

class Person {
  public String getsnm();
}

解决

修改函数名。

class Person {
  public String getSecondName();
}

搬移函数(Move Method)

问题

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

代码的坏味道(9)——异曲同工的类(Alternative Classes with Different Interfaces)

解决

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

代码的坏味道(9)——异曲同工的类(Alternative Classes with Different Interfaces)

添加参数(Add Parameter)

问题
某个函数需要从调用端得到更多信息。

class Customer {
  public Contact getContact();
}

解决
为此函数添加一个对象函数,让改对象带进函数所需信息。

class Customer {
  public Contact getContact(Date date);
}

令函数携带参数(Parameterize Method)

问题

若干函数做了类似的工作,但在函数本体中却包含了不同的值。

代码的坏味道(9)——异曲同工的类(Alternative Classes with Different Interfaces)
解决

建立单一函数,以参数表达哪些不同的值。

代码的坏味道(9)——异曲同工的类(Alternative Classes with Different Interfaces)

提炼超类(Extract Superclass)

问题

两个类有相似特性。

代码的坏味道(9)——异曲同工的类(Alternative Classes with Different Interfaces)

解决

为这两个类建立一个超类,将相同特性移至超类。

代码的坏味道(9)——异曲同工的类(Alternative Classes with Different Interfaces)

引申阅读

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

上一篇:更改wordpress的默认登录页面名称wp-login


下一篇:【重构】 代码的坏味道总结 Bad Smell (一) (重复代码 | 过长函数 | 过大的类 | 过长参数列 | 发散式变化 | 霰弹式修改)