步步为营 .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 }

总结

把公用函数和值域放到其基类中去,方便其它函数调用。

posted @ 2011-06-02 00:20  网络金领  阅读(228)  评论(0编辑  收藏  举报