好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

步步为营 .NET 代码重构学习笔记 五、移动函数和移动值域(Move Method And Mov

步步为营 .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的详细内容...

  阅读:52次