步步为营 .NET 代码重构学习笔记 五、移动函数和移动值域(Move Method And Move Field)
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 }
总结
把公用函数和值域放到其基类中去,方便其它函数调用。
作者: Leo_wl
出处: http://www.cnblogs.com/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息查看更多关于步步为营 .NET 代码重构学习笔记 五、移动函数和移动值域(Move Method And Mov的详细内容...