在对象之间搬移特性---搬移函数

来源:互联网 发布:linux 查看服务器型号 编辑:程序博客网 时间:2024/05/16 19:43
你的程序中,有个函数与其所驻类之外的另一个类进行更多交流:调用后者,或被后者调用
在该函数最常引用的类中建立一个有着类似行为的新函数。将旧函数变成一个单纯的委托函数。
,或是将旧函数完全移除。

动机:

搬移函数是重构理论的支柱。如果一个类有太多行为,或者一个类与另外一个类有太多合作而形成高度耦合,就需要搬移函数。通过这种手段,可以使系统中的类更简单,这些类最终也将更干净利落的实现系统交付的任务。
首先浏览类的所有函数,从中寻找这样的函数:使用另一个对象的次数比使用自己所驻对象的次数还多。一旦移动了一些字段,就该做这样的检查。一旦发现有可能搬移的函数,就需要观察调用它的那一端、它调用的那一端,以及继承体系中它的任何一个重定义函数。然后,会根据“这个函数与哪个对象的交流比较多”,决定其移动路径。

范例:

用一个账户的Account类来说明这项重构:

Class  Account....
double overdraftCharge(){
  if(_type.isPremium){
double result=1.0;
if(_daysOverDrawn>7)
result+=(daysOverDrawn-7)*0.85;
}
else 
return daysOvedrDrawn*1.75;
}

double bankCharge(){
duoble result=4.5;
if(_daysOverDrawn>0){
result+=overdraftCharge();
return result;
}

}

private AccountType _type;
private int _daysOVerDrawn;

假如有几种新账户,每一种都有自己的“透支金额计费规则”。所以我希望将overdraftCharge()搬移到AccountType类中去。

class AccountType{
double overdraftCharge(int daysOverdrawn){
if(isPremium){
double reuslt=10;
if(daysOverdrawn>7)result+=(daysOverdrawn-7)*0.85;
reutrn result;
}else{
return daysOverdrawn*1.75;
}
}
}

将原函数中的函数本体替换为一个简单的委托动作:
Class Account...
double overdraftCharge(){
return _type.overdraftCharge(_daysOverdrawn);
}

此例中被搬移函数只引用了一个字段_daysOverdrawn;所以只需要将这个字段作为参数传递给目标函数就行了。如果被搬移函数调用了Account中的另一个函数,就不能这么简单的处理了。这种情况下必须将源对象传递给目标函数。
Class AccountType...
double overdraftCharge(Account account){
if(isPremium){
double result=10;
if(account.getDaysOverdrawn()>7){

result+=(account.getrDaysOvderDrawn()-7)*0.85;
return result;
}else{
return account.getDaysOverDrawn()*1.75;
}
}
}

如果需要源对象的多个特性,那么也需要将源对象传递给目标函数。不过目标函数如果需要太多源对象的特性,就得进一步重构。通常这种情况下,就会需要分解函数,并将其中一部分移回源类。







0 0