步步为营 .NET 代码重构学习笔记 五、移动函数和移动值域(Move Method And Mov
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
}
总结
把公用函数和值域放到其基类中去,方便其它函数调用。
补充:Web开发 , ASP.Net ,