7.1 move method (搬移函数)
来源:互联网 发布:2017网络语言 英文 编辑:程序博客网 时间:2024/05/16 18:30
程序中,有个函数与其所驻类之外的另一个类进行更多交流:调用后者,或被后者调用。
在该函数最常引用的类中建立一个有着类似行为的新函数。将旧函数变成一个单纯的委托函数,或是将旧函数完全移除。
动机:
如果一个类有太多行为,或如果一个类与另一个类有太多合作而形成高度耦合,我就会搬移函数。
使用另一个对象的次数比使用自己所驻对象的次数还多。观察调用它的那一端,它调用的那一端,以及继承体系中它的任何一个重定义函数。
做法:
检查源类中被源函数所使用的一切特性,考虑它们是否也该被搬移。
=》如果某个特性只被你打算搬移的那个函数用到,就应该将它一并搬移。如果另有其他函数使用了这个特性,你可以考虑将使用该特性的所有函数全都一并搬移。有时候,搬移一组函数比逐一搬移简单些。
检查源类的子类和超类,看看是否有该函数的其他声明。
=》如果出现其他声明,你或许无法进行搬移,除非目标类也同样表现出多态性。
在目标类中声明这个函数
=》你可以为此函数选择一个新名称,对目标类更有意义的名称。
将原函数的代码复制到目标函数中。调整后者,使其能在新家中正常运行。
=》如果目标函数使用了源类中的特性,你的决定如何从目标函数引用源对象。如果目标类中没有相应的引用机制,就把源对象的引用当做参数,传给新建立的目标函数。
=》如果源函数包含异常处理,你得判断逻辑上应该由哪个类来处理这一异常。如果应该由源类来负责,就把异常处理留在原地。
决定如何从源函数正确引用目标对象。
=》可能会有一个现成的字段或函数帮助你取得目标对象。如果没有,就看能否轻松建立一个这样的函数。如果还是不能,就得在源类中新建一个字段来保存目标对象。这可能是一个永久性修改,但你也可以让它是暂时的,因为后续的其他重构项目可能会把这个新建字段去掉。
修改源函数,使之成为一个纯委托函数。
决定是否删除源函数,或将它当做一个委托函数保留下来。
如果要移除源函数,请将源类中对源函数的所有调用,替换为目标函数的调用。
旧代码
class Account... double overdraftCharge(){ if(_type.isPremium()){ double result = 10; if(_daysOverDraw > 7) result += (_daysOverdrawn - 7) * 0.85; } else return _daysOverdrawn * 1.75; } double bankcharge(){ double result = 4.5; if(_daysOverdrawn > 0) result += overdraftCharge(); else return result; } private AccountType _type; private int _daysOverdrawn;
新代码
如果只有但特性交叉。
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; }class Account .. double overdraftcharge(){ return _type.overdraftCharge(_daysOverdrawn); }class Account... double bankcharge(){ double result = 4.5; if(_daysOverdrawn > 0) result += _type.overdraftCharge(_daysOverdrawn); return result; }
如果有多特性和函数交叉
class AccountType... double overdraftCharge(Account account){ if(isPremium()){ double result = 10; if(account.getDaysOverdrawn() > 7) result += (account.getDaysOverdrawn() - 7) * 0.85; return result; } else return account.getDaysOverdrawn * 1.75; }class Account .. double overdraftcharge(){ return _type.overdraftCharge(_daysOverdrawn); }class Account... double bankcharge(){ double result = 4.5; if(_daysOverdrawn > 0) result += _type.overdraftCharge(_daysOverdrawn); return result; }
- 7.1 move method (搬移函数)
- Move Method(搬移函数)
- 《Refactoring》,Move Method(搬移函数)
- 在对象之间搬移特性之一 :Move Method(搬移函数)
- Move Field(搬移值域)
- 7.2 move field (搬移字段)
- 在对象之间搬移特性之七 :Introduce Foreign Method(引入外加函数)
- 在对象之间搬移特性---搬移函数
- 重构:Move Method
- 在对象之间搬移特性之二 :Move Field(搬移值域)
- Move函数
- Refactoring Day 2 : Move Method
- 重构笔记——搬移函数
- move构造函数,move赋值函数
- move函数的用法
- move函数的用法
- “可怕的”System.Move函数!!!
- 迁移方法(Move Method)--代码重构2
- 通过sql server存储过程自动下载网络csv文件,来更新数据库
- java的线程与锁
- 领悟
- 常用网址
- 很实用的东东 集锦
- 7.1 move method (搬移函数)
- C语言之父Dennis Ritchie辞世
- Extjs2.0+gridPanel+checkbox读取从数据库中写入到xml文件的字段
- 基于android 的GPS 移植——调用关系
- 智立方董事长杨石头经典语录
- eclipse 安装 maven (m2eclipse)
- Android如何把文件存放在SDCard
- java.sql.PreparedStatement 和 java.sql.Statement区别
- java编码规则