坏味道——不完美的库类(Incomplete Library Class)

特征

当一个类库已经不能满足实际需要时,你就不得不改变这个库(如果这个库是只读的,那就没辙了)。

问题原因

许多编程技术都建立在库类的基础上。库类的作者没用未卜先知的能力,不能因此责怪他们。麻烦的是库往往构造的不够好,而且往往不可能让我们修改其中的类以满足我们的需要。

解决方法

  • 如果你只想修改类库的一两个函数,可以运用 引入外加函数(Introduce Foreign Method)
  • 如果想要添加一大堆额外行为,就得运用 引入本地扩展(Introduce Local Extension)

收益

  • 减少代码重复(你不用一言不合就自己动手实现一个库的全部功能,代价太高)

何时忽略

  • 如果扩展库会带来额外的工作量。

重构方法说明

引入外加函数(Introduce Foreign Method)

问题

你需要为提供服务的类增加一个函数,但你无法修改这个类。

class Report {
  //...
  void sendReport() {
    Date nextDay = new Date(previousEnd.getYear(),
      previousEnd.getMonth(), previousEnd.getDate() + 1);
    //...
  }
}

解决

在客户类中建立一个函数,并一个第一个参数形式传入一个服务类实例。

class Report {
  //...
  void sendReport() {
    Date newStart = nextDay(previousEnd);
    //...
  }
  private static Date nextDay(Date arg) {
    return new Date(arg.getYear(), arg.getMonth(), arg.getDate() + 1);
  }
}

引入本地扩展(Introduce Local Extension)

问题

你需要为服务类提供一些额外函数,但你无法修改这个类。

代码的坏味道(22)——不完美的库类(Incomplete Library Class)-LMLPHP

解决

建立一个新类,使它包含这些额外函数,让这个扩展品成为源类的子类或包装类。

代码的坏味道(22)——不完美的库类(Incomplete Library Class)-LMLPHP

引申阅读

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

04-24 00:32