Introduce Foreign Method (引入外加函数)

Summary: 

你须要为提供服务的类增长一个函数。但你没法修改这个类。在客户类中创建一个函数,并以第一参数形式传入一个服务类实例。 java

Motivation:

你正在使用一个类,它提供了全部须要的服务,可是不久以后,你有须要一项新的服务,这个类却没法供应。若是能够修改源码,那么事情很简单,你本身加一个新函数,若是不行,就得在客户端编码,补足你要的那个函数。 函数

若是客户类只使用这项功能一次,这样作没什么关系,可是若是你须要屡次使用这个函数,或者你发现本身为一个服务类创建了大量外加函数,或者发现有许多类都须要一样的外加函数,那就不该该再使用本项重构,而应该使用Introduce Local Extension. 编码

可是不要忘记:外加函数终归是权宜之计。若有可能,仍是尽可能把它放在该放的位置。 spa

Mechanics: 

1.在客户类中创建一个函数,用来提供你须要的功能 code

这个函数不该该调用客户类的任何特性。若是它须要一个值,把该值当作参数传给它 get

2.以服务类实例做为该函数的第一个参数 源码

3.将该函数注释为:“外加函数 (foreign method),应在服务类实现” io

这么一来,若是未来有机会将外加函数搬移到服务类中时,你即可以轻松找出这些外加函数。 class

范例

        程序中,须要跨过一个收费周期。本来代码像这样: 重构

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);
}
相关文章
相关标签/搜索