Introduce Foreign Method (引入外加函数)

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);
}

转载于:https://my.oschina.net/u/134516/blog/129570

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值