当前位置:编程学习 > asp >>

步步为营 .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 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,