坏味道——不完美的库类(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)
问题
你需要为服务类提供一些额外函数,但你无法修改这个类。
解决
建立一个新类,使它包含这些额外函数,让这个扩展品成为源类的子类或包装类。
引申阅读
欢迎继续阅读 代码的症与药 系列文章。