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

发布时间:2017-1-18 18:00:12 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"代码的坏味道(19)——狎昵关系(Inappropriate Intimacy) ",主要涉及到代码的坏味道(19)——狎昵关系(Inappropriate Intimacy) 方面的内容,对于代码的坏味道(19)——狎昵关系(Inappropriate Intimacy) 感兴趣的同学可以参考一下。

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

特征

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

img

问题原因

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

解决方法

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

img

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

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

收益

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

img

重构方法说明

搬移函数(Move Method)

问题

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

img

解决

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

img

搬移字段(Move Field)

问题

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

img

解决

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

img

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

问题

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

img

解决

去除不必要的关联。

img

提炼类(Extract Class)

问题

某个类做了不止一件事。
img

解决

建立一个新类,将相关的字段和函数从旧类搬移到新类。
img

隐藏委托关系(Hide Delegate)

问题

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

img

解决

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

img

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

问题

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

img

解决

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

img

引申阅读

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

上一篇:__weak与__block区别,深层理解两者区别

相关文章

相关评论