代码的坏味道(19)——狎昵关系(Inappropriate Intimacy)

坏味道——狎昵关系(Inappropriate Intimacy)

特征

一个类大量使用另一个类的内部字段和方法。

代码的坏味道(19)——狎昵关系(Inappropriate Intimacy)

问题原因

类和类之间应该尽量少的感知彼此(减少耦合)。这样的类更容易维护和复用。

解决方法

  • 最简单的解决方法是运用 搬移函数(Move Method)搬移字段(Move Field) 来让类之间斩断羁绊。

代码的坏味道(19)——狎昵关系(Inappropriate Intimacy)

  • 你也可以看看是否能运用 将双向关联改为单向关联(Change Bidirectional Association to Unidirectional) 让其中一个类对另一个说分手。

  • 如果这两个类实在是情比金坚,难分难舍,可以运用 提炼类(Extract Class) 把二者共同点提炼到一个新类中,让它们产生爱的结晶。或者,可以尝试运用 隐藏委托关系(Hide Delegate) 让另一个类来为它们牵线搭桥。
  • 继承往往造成类之间过分紧密,因为子类对超类的了解总是超过后者的主观愿望,如果你觉得该让这个子类自己闯荡,请运用 以委托取代继承(Replace Inheritance with Delegation) 来让超类和子类分家。

收益

  • 提高代码组织性。
  • 提高代码复用性。

代码的坏味道(19)——狎昵关系(Inappropriate Intimacy)

重构方法说明

搬移函数(Move Method)

问题

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

代码的坏味道(19)——狎昵关系(Inappropriate Intimacy)

解决

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

代码的坏味道(19)——狎昵关系(Inappropriate Intimacy)

搬移字段(Move Field)

问题

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

代码的坏味道(19)——狎昵关系(Inappropriate Intimacy)

解决

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

代码的坏味道(19)——狎昵关系(Inappropriate Intimacy)

将双向关联改为单向关联(Change Bidirectional Association to Unidirectional)

问题

两个类之间有双向关联,但其中一个类如今不再需要另一个类的特性。

代码的坏味道(19)——狎昵关系(Inappropriate Intimacy)

解决

去除不必要的关联。

代码的坏味道(19)——狎昵关系(Inappropriate Intimacy)

提炼类(Extract Class)

问题

某个类做了不止一件事。
代码的坏味道(19)——狎昵关系(Inappropriate Intimacy)

解决

建立一个新类,将相关的字段和函数从旧类搬移到新类。
代码的坏味道(19)——狎昵关系(Inappropriate Intimacy)

隐藏委托关系(Hide Delegate)

问题

客户通过一个委托类来调用另一个对象。

代码的坏味道(19)——狎昵关系(Inappropriate Intimacy)

解决

在服务类上建立客户所需的所有函数,用以隐藏委托关系。

代码的坏味道(19)——狎昵关系(Inappropriate Intimacy)

以委托取代继承(Replace Inheritance with Delegation)

问题

某个子类只使用超类接口中的一部分,或是根本不需要继承而来的数据。

代码的坏味道(19)——狎昵关系(Inappropriate Intimacy)

解决

在子类中新建一个字段用以保存超类;调整子类函数,令它改而委托超类;然后去掉两者之间的继承关系。

代码的坏味道(19)——狎昵关系(Inappropriate Intimacy)

引申阅读

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

上一篇:记一次debug记录:Uncaught SyntaxError: Unexpected token ILLEGAL


下一篇:我是如何在SQLServer中处理每天四亿三千万记录的