好得很程序员自学网

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

步步为营 .NET 代码重构学习笔记 十四

步步为营 .NET 代码重构学习笔记 十四

一、Form Templlate Method(塑造模板函数)

动机(Motivation)

有一些subclasses,其中相应的某些函数以相同顺序执行类似的措施,但各措施实际上有所不同。将各个措施分别放进独立函数中,并保持它们都有相同的签名式(signature),于是原函数也就变得相同了。然后将原函数上移至baseclass。

示例

01 public   abstract   class   Site

02 {

03      private   double   _unit;

04      private   double   _rate;

05      private   double   _taxRate;

06  

07      public   double   TaxRate

08      {

09          get   {  return   _taxRate; }

10          set   { _taxRate = value; }

11      }

12  

13      public   double   Unit

14      {

15          get   {  return   _unit; }

16          set   { _unit = value; }

17      }

18  

19      public   double   Rate

20      {

21          get   {  return   _rate; }

22          set   { _rate = value; }

23      }

24 }

25  

26 public   class   ResidentialSite : Site

27 {

28      public   double   GetBillableAmount()

29      {

30          double   baseAmount = Unit * Rate;

31          double   tax = baseAmount * TaxRate;

32          return   basePrice + tax;

33      }

34 }

35  

36 public   class   LifeLineSite : Site

37 {

38      public   double   GetBillableAmount()

39      {

40          double   baseAmount = Unit * Rate*0.5;

41          double   tax = baseAmount * TaxRate*0.2;

42          return   basePrice + tax;

43      }

44 }

改为

01 public   abstract   class   Site

02 {

03      private   double   _unit;

04      private   double   _rate;

05      private   double   _taxRate;

06  

07      public   double   TaxRate

08      {

09          get   {  return   _taxRate; }

10          set   { _taxRate = value; }

11      }

12  

13      public   double   Unit

14      {

15          get   {  return   _unit; }

16          set   { _unit = value; }

17      }

18  

19      public   double   Rate

20      {

21          get   {  return   _rate; }

22          set   { _rate = value; }

23      }

24      public   abstract   double   GetBaseAmount();

25      public   abstract   double   GetTaxAmount();

26      public   double   GetBillAbleAmount()

27      {

28          return   GetBaseAmount() + GetTaxAmount();

29      }

30       

31 }

32  

33 public   class   ResidentialSite : Site

34 {

35      public   override   double   GetBaseAmount()

36      {

37          return   Unit * Rate;

38      }

39  

40      public   override   double   GetTaxAmount()

41      {

42          return   baseAmount * TaxRate; ;

43      }

44 }

45  

46 public   class   LifeLineSite : Site

47 {

48      public   override   double   GetBaseAmount()

49      {

50          return   Unit * Rate * 0.5;

51      }

52  

53      public   override   double   GetTaxAmount()

54      {

55          return   baseAmount * TaxRate * 0.2;

56      }

57 }

二、Replace Inheritance with Delegation(以委托取代继承)

动机(Motivation)

某个subclass只使用superclass接口中的一部分,或是根本不需要继承而来的数据。在subclass中新建一个值域用以保存superclass;调整subclass函数,令它改而委托superclass;然后去掉两者之间的继承关系。

示例

01 public   class   Vector

02 {

03      public   int   Size()

04      {

05          return   100;

06      }

07  

08      public   bool   IsEmpte()

09      {

10          return   false ;

11      }

12 }

13  

14 public   class   MyStack : Vector

15 {

16  

17 }

改为

01 public   class   Vector

02 {

03      public   int   Size()

04      {

05          return   100;

06      }

07  

08      public   bool   IsEmpty()

09      {

10          return   false ;

11      }

12 }

13  

14 public   class   MyStack

15 {

16      private   Vector _vector;

17  

18      public   int   Size()

19      {

20          return   _vector.Size();

21      }

22 }

三、Replace Delegation with Inheritance(以继承取代委托)

动机(Motivation)

如果发现自己需要使用委托class中的所有函数,并且费了很大力气编写所有极简的请托函数(delegating methods),请回头使用继承。

示例

01 public   class   Vector

02 {

03      public   int   Size()

04      {

05          return   100;

06      }

07  

08      public   bool   IsEmpty()

09      {

10          return   false ;

11      }

12 }

13  

14 public   class   MyStack

15 {

16      private   Vector _vector;

17  

18      public   int   Size()

19      {

20          return   _vector.Size();

21      }

22  

23      public   bool   IsEmpty()

24      {

25          return   _vector.IsEmpty();

26      }

27 }

改为

01 public   class   Vector

02 {

03      public   int   Size()

04      {

05          return   100;

06      }

07  

08      public   bool   IsEmpte()

09      {

10          return   false ;

11      }

12 }

13  

14 public   class   MyStack : Vector

15 {

16  

17 }

1    

1    

1    

四、Tease Apart Inheritance(梳理并分解继承体系)

动机(Motivation)

某个继承体系(inheritance hierarchy)同时承担两项责任。建立两个继承体系,并通过委托关系(delegation)让其中一个可以调用另一个。

示例

改为

五、Convert Procedural Design to Objects(将过程化设计转化为对象设计)

动机(Motivation)

有一些代码,以传统的过程化风格(procedural style)写就。将数据记录(data records)变成对象,将形为分开,并将行为移入相关对象之中。

示例

改为

六、Separate Domain from Presentation(将领域和表述/显示分离)

动机(Motivation)

某些GUI classes之中包含了domain logic(领域逻辑)。将domain logic(领域逻辑)分离出来,为它们建立独立的domain classes。

示例

改为

七、Extract Hierarchy(提炼继承体系)

动机(Motivation)

有某个class做了大多工作,其中一部分工作是以大量条件式完成的。建立继承体系,以一个subclass表示一种特殊情况。

示例

改为

步步为营 .NET 代码重构学习笔记系列

步步为营 .NET 代码重构学习笔记 一、为何要代码重构

步步为营 .NET 代码重构学习笔记 二、提炼方法(Extract Method)

步步为营 .NET 代码重构学习笔记 三、内联方法(Inline Method)

步步为营 .NET 代码重构学习笔记 四、临时变量(Temporary Variable)

步步为营 .NET 代码重构学习笔记 五、分解函数和替换算法(Replace Method And Substitute Algorithm)

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

步步为营 .NET 代码重构学习笔记 七

步步为营 .NET 代码重构学习笔记 八

步步为营 .NET 代码重构学习笔记 九

步步为营 .NET 代码重构学习笔记 十

步步为营 .NET 代码重构学习笔记 十一

步步为营 .NET 代码重构学习笔记 十二

步步为营 .NET 代码重构学习笔记 十三

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于步步为营 .NET 代码重构学习笔记 十四的详细内容...

  阅读:48次