在对象之间搬移特性之七 :Introduce Foreign Method(引入外加函数)
来源:互联网 发布:免费手机qq机器人软件 编辑:程序博客网 时间:2024/05/14 19:39
你所使用的server class需要一个额外函数,但你无法修改这个class。
在client class中建立一个函数,并以一个server class实体作为第一引数(argument) :
Date newStart = new Date (previousEnd.getYear(),
previousEnd.getMonth(), previousEnd.getDate() + 1);
Date newStart = nextDay(previousEnd);
private static Date nextDay(Date arg) {
return new Date (arg.getYear(),arg.getMonth(), arg.getDate() + 1);
}
动机(Motivation)
这种事情发生过太多次了:你正在使用一个class,它真的很好,为你提供了你想要的所有服务。而后,你又需要一项新服务,这个class却无法供应。于是你开始咒骂:「为什么不能做这件事?」如果可以修改源码,你便可以自行添加一个新函数; 如果不能,你就得在客户端编码,补足你要的那个函数。
如果client class只使用这项功能一次,那么额外编码工作没什么大不了,甚至可能根本不需要原本提供服务的那个class。然而如果你需要多次使用这个函数,你就得不断重复这些代码。还记得吗,重复的代码是软件万恶之源。这些重复性代码应该被抽出来放进同一个函数中。进行本项重构时,如果你以外加函数实现一项功能, 那就是一个明确信号:这个函数原本应该在提供服务的(server)class中加以实现。
如果你发现自己为一个server class建立了大量外加函数,或如果你发现有许多classes都需要同样的外加函数,你就不应该再使用本项重构,而应该使用 Introduce Local Extension。
但是不要忘记:外加函数终归是权宜之计。如果有可能,你仍然应该将这些函数搬移到它们的理想家园。如果代码拥有权(code ownership)是个需要考量的问题, 就把外加函数交给server class的拥有者,请他帮你在此server class中实现这个函数。
作法(Mechanics)
范例(Examples)
程序中,我需要跨过一个收费周期(billing period)。原本代码像这样:
Date newStart = new Date (previousEnd.getYear(),
previousEnd.getMonth(), previousEnd.getDate() + 1);
我可以将赋值运算右侧代码提炼到一个独立函数中。这个函数就是Date class的一个外加函数:
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);
}
- 在对象之间搬移特性之七 :Introduce Foreign Method(引入外加函数)
- Introduce Foreign Method(引入外加函数)
- 7.7 introduce foreign method(引入外加函数)
- 在对象之间搬移特性之八 :Introduce Local Extension(引入本地扩展)
- 在对象之间搬移特性之一 :Move Method(搬移函数)
- 在对象之间搬移特性---搬移函数
- 在对象之间搬移特性(一)
- 在对象之间搬移特性(二)
- 在对象之间搬移特性之二 :Move Field(搬移值域)
- 在对象之间搬移特性
- 《重构》读书笔记(七)——第七章 在对象之间搬移特性
- 重构之在对象之间搬移特性
- 重构之在对象之间搬移特性
- 第七章 在对象之间搬移特性
- 3、在对象之间搬移特性
- 第七章 在对象之间搬移特性
- 7. 在对象之间搬移特性
- 在对象之间搬移特性之三 :Extract Class(提炼类)
- 通过表名查字段详细 (DDIF_FIELDINFO_GET)
- vc中extern的用法 详解
- 软件分层必须遵守的原则
- 第 3 章 单例模式【Singleton Pattern】
- 散列表(哈希表)
- 在对象之间搬移特性之七 :Introduce Foreign Method(引入外加函数)
- Java 单例模式的七种写法
- Android应用开发笔记(12):Android应用的自动升级、更新模块的实现
- flex httpservice与java通讯的中文乱码解决。
- windows 7环境下配置oracle 11g 客户端
- xfire+digester+weblogic92实现webservice接口,digester.parse(inputstream)时报空指针错
- RobotFrameWork(五)控制流之if语句——Run Keyword If
- 项目中用到的增强合集
- android 输入法相关