Summary:
你需要为提供服务的类增加一个函数。但你无法修改这个类。在客户类中建立一个函数,并以第一参数形式传入一个服务类实例。
Motivation:
你正在使用一个类,它提供了所有需要的服务,但是不久之后,你有需要一项新的服务,这个类却无法供应。如果可以修改源码,那么事情很简单,你自己加一个新函数,如果不行,就得在客户端编码,补足你要的那个函数。
如果客户类只使用这项功能一次,这样做没什么关系,但是如果你需要多次使用这个函数,或者你发现自己为一个服务类建立了大量外加函数,或者发现有许多类都需要同样的外加函数,那就不应该再使用本项重构,而应该使用Introduce Local Extension.
但是不要忘记:外加函数终归是权宜之计。如有可能,还是尽量把它放在该放的位置。
Mechanics:
1.在客户类中建立一个函数,用来提供你需要的功能
这个函数不应该调用客户类的任何特性。如果它需要一个值,把该值当做参数传给它
2.以服务类实例作为该函数的第一个参数
3.将该函数注释为:“外加函数 (foreign method),应在服务类实现”
这么一来,如果将来有机会将外加函数搬移到服务类中时,你便可以轻松找出这些外加函数。
范例
程序中,需要跨过一个收费周期。原本代码像这样:
Date newStart = new Date (previousEnd.getYear(), previousEnd.getMonth(), previousEnd.getDate() + 1); 可以将赋值运算右侧代码提炼到一个独立函数中。这个函数就是Date 类的一个外加函数:
Date newStart = nextDay(previousEnd);
private static Date nextDay(Date arg){
//foreign method, should be on Date
return new Date(arg.getYear(), arg.getMonth(), arg.getDate + 1);
}