java move函数重新调用_Move Method (搬移函数)
Summary:
程序中,有个函数与其所驻类之外的另个一个函数进行更多的交流:调用后者,或者被后者调用。
在该函数最常引用的类中建立一个有着类似行为的新函数。将旧函数变成一个单纯的委托函数,或是将旧函数完全移除。
Motivation:
“搬移函数”是重构理论的支柱。如果有一个类有太多行为,或如果一个类与另一个类有太多合作而形成高度耦合,就可以办以函数。通过这种手段,可以使系统中的类更简单,这些类最终也将更干净利落地实现系统交付的任务。
Mechanics:
1. 检查源类中被源函数所使用的一切特性(包括字段和函数),考虑它们是否也该被搬移。
如果某个特性只被打算搬移的那个函数用到,就应该将它一并搬移。如果另有其他函数使用了这个特性,可以考虑将使用该特性的所有函数全都一并搬移。有时候,搬移一组函数比逐一搬移简单些。
2.检查源类的子类和超类,看看是否有该函数的其他声明。
如果出现其他声明,或许无法进行搬移,除非目标类也同样表现出多态性。
3.在目标类中声明这个函数。
可以为此函数选择一个新名称—对目标类更有意义的名称
4. 将源函数的代码复制到目标函数中。调整后者,使其能在新类中正常运行
如果目标函数使用了源类中的特性,我们得决定如何从目标函数引用源对象。如果目标类中没有相应的引用机制,就得把源对象的引用当做参数,传给新建立的目标函数。
如果源函数包含异常处理,我们得判断逻辑上应该由哪个类来处理这一异常。如果应该由源类来负责,就把异常处理留在原地。
5. 编译目标类
6. 决定如何从源函数正确引用目标对象。
可能会有一个现成的字段或函数帮助取得目标对象。如果没有,就看能否轻松建立一个这样的函数。如果还是不行,就得在源类中新建一个字段来保存目标对象。这可能是一个永久性修改,但也可以让它是暂时的,因为后继的其他重构项目可能会把这个新建字段去掉。
7.修改源函数,使之成为一个纯委托函数
8.编译,测试
9. 决定是否删除源函数,或将它当作一个委托函数保留下来
如果要经常在源对象中引用目标函数,那么将源函数作为委托函数保留下来会比较简单。
10.如果要移除源函数,请将源类中对源函数的所有调用,替换为对目标函数的调用
11. 编译,测试。
范例
我们用一个表示账户的Account类来说明这项重构
public class Account
{
private AccountType type;
private int daysOverdrawn;
double overdraftCharge()
{
if( type.isPremium() )
{
double result = 10;
if( daysOverdrawn > 7 )
{
result += ( daysOverdrawn - 7 ) * 0.85;
return result;
}
}
else
{
return daysOverdrawn * 1.75;
}
return 0;
}
double bankCharge(){
double result = 4.5;
if( daysOverdrawn > 0 )
{
result += overdraftCharge();
}
return result;
}
} 假设有几种新账户,每一种都有自己的“透支金额计费规则”。所以我们希望将overdraftCharge() 搬移到AccountType 类去。
第一步要做的是:观察被overdraftCharge()使用的每一项特性,考虑是否值得将它们与overdraftCharge() 一起移动。此例中,我们需要让daysOverdrawn字段留在Account类,因为这个值不会随不同种类的账户而变化。然后,我们将overdraftCharge()函数复制到AccountType中,并做相应调整。
public class AccountType
{
double overdraftCharge( int daysOverdrawn )
{
if( isPremium() )
{
double result = 10;
if( daysOverdrawn > 7 )
{
result += ( daysOverdrawn - 7 ) * 0.85;
return result;
}
}
else
{
return daysOverdrawn * 1.75;
}
return 0;
}
} 调整目标函数使之通过编译,而后就可以将源函数的函数本体替换为一个简单的委托动作,然后编译测试。
public class Account
{
private AccountType type;
private int daysOverdrawn;
double overdraftCharge()
{
return type.overdraftCharge( daysOverdrawn );
}
...
} 我们可以保留代码现在的样子,也可以删除源函数。如果决定删除,就得找出源函数的所有调用者,并将这些调用重新定向,改为调用Account的overdraftCharge().
在所有的调用点都修改完毕后,就可以删除源函数在Account中的声明了。如果被搬移的函数不是private的,还要检查其他类是否是用了这个函数。
此例中被搬移的函数只引用了一个字段,所以只需要将这个字段作为参数传给目标函数就行了。如果被搬移的函数调用了Account中的另一个函数,就不能这么简单的处理。这种情况下必须将源对象传递给目标函数。
如果需要源类的多个特性,那么我们也可以将源对象传递给目标函数。不过如果目标函数需要太多源类特性,就得进一步重构。通常这种情况下,我们需要分解目标函数,并将其中一部分移回源类。
java move函数重新调用_Move Method (搬移函数)相关推荐
- 重构手法——提炼函数、搬移函数、以多态取代条件表达式
目录 我的心路历程 我的学习概括 Extract Method(提炼函数) 动机*--做法 动机--做法* Move Method(搬移函数) 动机*--做法 动机--做法* Replace Cond ...
- python函数+定义+调用+多返回值+匿名函数+lambda+高级函数(reduce、map、filter)
python函数+定义+调用+多返回值+匿名函数+lambda+高级函数(reduce.map.filter) Python 中函数的应用非常广泛,比如 input() .print().range( ...
- 父类指针指向子类实例,用父类指针调用虚函数,调用的是子类的函数还是父类的函数...
父类指针指向子类实例,用父类指针调用虚函数,调用的是子类的函数还是父类的函数 以下程序的显示结果是什么,为什么 #include <iostream> using namespace st ...
- Java中introduce方法,Introduce Foreign Method (引入外加函数)
Summary: 你需要为提供服务的类增加一个函数.但你无法修改这个类.在客户类中建立一个函数,并以第一参数形式传入一个服务类实例. Motivation: 你正在使用一个类,它提供了所有需要的服务, ...
- java用if语句调用方法_J2SE中main函数中的if语句想要调用另一个类的方法怎么能实现?...
日常生活中,要完成一件复杂的功能,我们总是习惯把"大功能"分解为多个"小功能"以实现.在C++程序的世界里,"功能"可称呼为"函数 ...
- python调用js库中的函数_Python 调用JS文件中的函数
Python 调用JS文件中的函数 1.安装PyExecJS第三方库 2.导入库:import execjs 3.调用JS文件中的方法 Passwd = execjs.compile(open(r&q ...
- 匿名函数自我调用_Python中的匿名函数及递归思想简析
匿名函数 前言 上次咱们基本说了一下函数的定义及简单使用,Python中的基本函数及其常用用法简析,现在咱们整点进阶一些的.同样都是小白,咱也不知道实际需要不,但是对于函数的执行顺序以及装饰器的理解还 ...
- python函数被调用才能执行吗_python3x函数在不被调用的情况下运行
这是我的密码code __author__ = 'Jared Reabow' __name__ = 'Assignment 2 Dice game' #Date created: 14/11/2014 ...
- python3_函数_形参调用方式 / 不定长参数 / 函数返回值 / 变量作用域 / 匿名函数 / 递归调用 / 函数式编程 / 高阶函数 / gobal和nonlocal关键字 / 内置函数
1.形参的调用方式 1. 位置参数调用 2. 关键词参数调用 原则: 关键词参数调用不能写在位置参数调用的前边 def test1(name, age):print("name:" ...
- C语言函数递归调用实验报告,C语言函数的递归和调用实例分析
一.基本内容: C语言中的函数可以递归调用,即:可以直接(简单递归)或间接(间接递归)地自己调自己. 要点: 1.C语言函数可以递归调用. 2.可以通过直接或间接两种方式调用.目前只讨论直接递归调用. ...
最新文章
- ​5G行业应用成熟度洞察,哪些场景将率先起飞?|新基建技术洞察之
- sql server案例总结
- 语言用符号打印出落叶的图案_世界上最好玩的6种表情符号编程语言
- Ubuntu,QT5连接MySQL
- 论文笔记_S2D.01-2018-ICRA_Sparse-to-Dense:从稀疏深度样本+单一图像的深度预测
- 嵌入式DM(data matrix)码检测
- 如何用photoshop做24色环_PS色相环制作方法和教程
- android键盘怎么打韩文,手机韩文输入法九键盘如何使用?
- oracle最小值寒素,新人教版备考2020年浙江中考语文复习专题:基础知识与古诗文专项特训(五十六)D卷...
- leejianjun的博客 PHP生成word并可下载
- jsoup爬虫发送get、post请求、解析html、获取json
- 12月年末总结与新年期望
- HTML背景带视频的个人炫酷引导页源码
- 在c语言中 if语句后的一对原括号,c语言中if语句后的一对圆括号中
- 社招简历老被拒?大佬告诉你面试官只中意这些简历,快来看看吧!
- php获取汉字的首字母,PHP获取汉字的首字母
- ps如何增加可撤回的步数
- Ubuntu通过wine安装QQ无法输入账号怎么办?
- foreign 磁盘阵列_X3650M4 磁盘阵列
- AI人工智能在当前和未来社会的应用领域
热门文章
- 阿里巴巴校招实习 java 研发 123面
- 躲在被窝里偷偷学爬虫(6)---处理cookie模拟登录及代理IP
- 【Android】'Unfortunately, Package Installer has Stopped'的解决办法
- 安卓手机云控系统框架源码,PHP+Autojs, ,这套是空框架源码
- text-stroke实现文字描边(镂空)、text-fill-color实现文字填充渐变(+animation实现流光字体)...
- Jackie Chan Comments Spark Online Backlash
- 编译原理之Frist集与Follow集
- 【Python】一元线性回归的分析
- 艾永亮:疯传的秘密,一个手表如何一夜之间席卷全校?(下)
- 如何基于vue开发ui组件库(heaven-ui)