Move Method
概述
程序中,有个函数与其所驻class之外的另一个class进行更多交流,调用后者或被后者调用
动机(Motivation)
如果一个class有太多行为,或如果一个class与另一个class有太多合作而形成高度耦合(highly coupled),我们就会搬移函数。通过这种手段,我们可以使系统中的classes更简单,这些classes最终也将更干净利落地实现系统交付的任务。
示例
01 |
public class MoveMethod
|
02 |
{
|
03 |
private AccountType _type;
|
04 |
private int _daysOverdrawn;
|
05 |
public double OverDraftCharge()
|
06 |
{
|
07 |
if (_type.IsPremium())
|
08 |
{
|
09 |
double result = 10;
|
10 |
if (_daysOverdrawn > 7)
|
11 |
result += (_daysOverdrawn - 7) * 0.85;
|
12 |
return result;
|
13 |
}
|
14 |
else
|
15 |
return _daysOverdrawn * 1.75;
|
16 |
}
|
17 |
public double BankCharge()
|
18 |
{
|
19 |
double result = 4.5;
|
20 |
if (_daysOverdrawn > 0)
|
21 |
result += OverDraftCharge();
|
22 |
return result;
|
23 |
}
|
24 |
}
|
25 |
26 |
public class AccountType
|
27 |
{
|
28 |
public bool IsPremium()
|
29 |
{
|
30 |
return true ;
|
31 |
}
|
32 |
}
|
改为
01 |
public class MoveMethod
|
02 |
{ |
03 |
private AccountType _type;
|
04 |
05 |
public double BankCharge()
|
06 |
{
|
07 |
double result = 4.5;
|
08 |
if (_type._daysOverdrawn > 0)
|
09 |
result += _type.OverDraftCharge();
|
10 |
return result;
|
11 |
}
|
12 |
} |
13 |
14 |
public class AccountType
|
15 |
{ |
16 |
private int _daysOverdrawn;
|
17 |
18 |
public int DaysOverdrawn
|
19 |
{
|
20 |
get { return _daysOverdrawn; }
|
21 |
set { _daysOverdrawn = value; }
|
22 |
}
|
23 |
24 |
public bool IsPremium()
|
25 |
{
|
26 |
return true ;
|
27 |
}
|
28 |
29 |
public double OverDraftCharge()
|
30 |
{
|
31 |
if (IsPremium())
|
32 |
{
|
33 |
double result = 10;
|
34 |
if (_daysOverdrawn > 7)
|
35 |
result += (_daysOverdrawn - 7) * 0.85;
|
36 |
return result;
|
37 |
}
|
38 |
else
|
39 |
return _daysOverdrawn * 1.75;
|
40 |
}
|
41 |
} |
Move Field(搬移值域)
概述
在target class建立一个new field,修改source field的所有用户,令它们改用new field。
动机(Motivation)
对于一个field(值域),在其所驻class之外的另一个class中有更多函数使用了它,我就会考虑搬移这个field。
示例
01 |
public class MoveMethod
|
02 |
{ |
03 |
private AccountType _type;
|
04 |
private double _interestRate;
|
05 |
public double InterestForAmountDay( double amount, int days)
|
06 |
{
|
07 |
return _interestRate * amount * days / 365;
|
08 |
}
|
09 |
} |
10 |
11 |
public class AccountType
|
12 |
{ |
13 |
14 |
} |
改为
01 |
public class MoveMethod
|
02 |
{ |
03 |
private AccountType _type;
|
04 |
05 |
public double InterestForAmountDay( double amount, int days)
|
06 |
{
|
07 |
return _type.InterestRate * amount * days / 365;
|
08 |
}
|
09 |
} |
10 |
11 |
public class AccountType
|
12 |
{ |
13 |
private double _interestRate;
|
14 |
public double InterestRate
|
15 |
{
|
16 |
get { return _interestRate; }
|
17 |
set { _interestRate = value; }
|
18 |
}
|
19 |
} |
总结
把公用函数和值域放到其基类中去,方便其它函数调用。