好得很程序员自学网

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

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

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

一、Replace Exception with Test(以测试取代异常)

动机(Motivation)

面对一个[调用者可预先加以检查]的条件,你抛出了一个异常。修改调用者,使它在调用函数之前先做检查。

示例

01 private   Dictionary< int ,  string > _values;

02  

03 public   double   GetValueForPeriod( int   periodNumber)

04 {

05      try

06      {

07          return   _values[periodNumber];

08      }

09      catch

10      {

11          return   0;

12      }

13 }

改为

1 private   Dictionary< int ,  string > _values;

2  

3 public   double   GetValueForPeriod( int   periodNumber)

4 {

5      if   (_values.ContainsKey(periodNumber))

6          return   _values[periodNumber];

7      return   0;

8 }

二、Pull Up Field(值域上移)

动机(Motivation)

两个subclasses拥有相同的值域,将此一值域移至superclass。

示例

01 public   abstract   class   Emplayee

02 {

03  

04 }

05  

06 public   class   Salesman : Emplayee

07 {

08      private   string   _name;

09  

10      public   string   Name

11      {

12          get   {  return   _name; }

13          set   { _name = value; }

14      }

15 }

16  

17 public   class   Engineer : Emplayee

18 {

19      private   string   _name;

20  

21      public   string   Name

22      {

23          get   {  return   _name; }

24          set   { _name = value; }

25      }

26 }

改为

01 public   abstract   class   Emplayee

02 {

03      private   string   _name;

04  

05      public   string   Name

06      {

07          get   {  return   _name; }

08          set   { _name = value; }

09      }

10 }

11  

12 public   class   Salesman : Emplayee

13 {

14  

15 }

16  

17 public   class   Engineer : Emplayee

18 {

19  

20 }

三、Pull Up Method(函数上移)

动机(Motivation)

有些函数,在各个subclass中产生完全相同的结果。将该函数移至superclass。

示例

01 public   abstract   class   Emplayee

02 {

03  

04 }

05  

06 public   class   Salesman : Emplayee

07 {

08      public   string   GetName()

09      {

10          return   "spring yang" ;

11      }

12 }

13  

14 public   class   Engineer : Emplayee

15 {

16      public   string   GetName()

17      {

18          return   "spring yang" ;

19      }

20 }

改为

01 public   abstract   class   Emplayee

02 {

03      public   string   GetName()

04      {

05          return   "spring yang" ;

06      }

07 }

08  

09 public   class   Salesman : Emplayee

10 {

11 }

12  

13 public   class   Engineer : Emplayee

14 {

15 }

四、Pull Up Constructor Body(构造函数本体上移)

动机(Motivation)

在各个subclass中拥有一些构造函数,它们的本体代码几乎一致,在base中新建一个构造函数,并在subclass构造函数中调用它。

示例

01 public   abstract   class   Emplayee

02 {

03      private   string   _ID;

04      private   string   _name;

05  

06      public   string   ID

07      {

08          get   {  return   _ID; }

09          set   { _ID = value; }

10      }

11  

12      public   string   Name

13      {

14          get   {  return   _name; }

15          set   { _name = value; }

16      }

17 }

18  

19 public   class   Salesman : Emplayee

20 {

21      public   Salesman( string   id,  string   name)

22      {

23          ID = id;

24          Name = name;

25      }

26 }

改为

01 public   abstract   class   Emplayee

02 {

03      private   string   _ID;

04      private   string   _name;

05  

06      public   string   ID

07      {

08          get   {  return   _ID; }

09          set   { _ID = value; }

10      }

11  

12      public   string   Name

13      {

14          get   {  return   _name; }

15          set   { _name = value; }

16      }

17  

18      public   Emplayee( string   id,  string   name)

19      {

20          _ID = id;

21          _name = name;

22      }

23 }

24  

25 public   class   Salesman : Emplayee

26 {

27      public   Salesman( string   id,  string   name): base (id,name)

28      {

29      }

30 }

五、Push Down Method(函数下移)

动机(Motivation)

superclass中的某个函数只与部分(而非全部)subclasses有关。将这个函数移到相关的那些subclasses去。

示例

01 public   abstract   class   Emplayee

02 {

03      public   double   GetQuota()

04      {

05          return   0;

06      }

07 }

08  

09 public   class   Salesman : Emplayee

10 {

11  

12 }

13  

14 public   class   Engineer : Emplayee

15 {

16  

17 }

改为

01 public   abstract   class   Emplayee

02 {

03  

04 }

05  

06 public   class   Salesman : Emplayee

07 {

08      public   double   GetQuota()

09      {

10          return   0;

11      }

12 }

13  

14 public   class   Engineer : Emplayee

15 {

16  

17 }

六、Push Down Field(值域下移)

动机(Motivation)

superclass中的某个值域只被部分(而非全部)subclasses用到。将这个值域移到需要它的那些subclasses去。

示例

01 public   abstract   class   Emplayee

02 {

03      private   double   _quota;

04      public   double   Quota

05      {

06          get   {  return   _quota; }

07          set   { _quota = value; }

08      }

09 }

10  

11 public   class   Salesman : Emplayee

12 {

13  

14 }

15  

16 public   class   Engineer : Emplayee

17 {

18  

19 }

改为

01 public   abstract   class   Emplayee

02 {

03  

04 }

05  

06 public   class   Salesman : Emplayee

07 {

08      private   double   _quota;

09      public   double   Quota

10      {

11          get   {  return   _quota; }

12          set   { _quota = value; }

13      }

14 }

15  

16 public   class   Engineer : Emplayee

17 {

18  

19 }

七、Extract Subclass(提炼子类)

动机(Motivation)

class中的某些特性(features)只被某些(而非全部)实体(instances)用到,新建一个subclass,将上面所说的那一部分特性移到subclass中。

示例

01 public   class   JobItem

02 {

03      public   double   GetTotalPrice()

04      {

05          return   1000;

06      }

07  

08      public   double   GetUnitPrice()

09      {

10          return   10;

11      }

12  

13      public   string   GetEmployee()

14      {

15          return   100;

16      }

17 }

改为

01 public   class   JobItem:BaseItem

02 {

03      public   double   GetTotalPrice()

04      {

05          return   1000;

06      }

07  

08 }

09  

10 public   class   BaseItem

11 {

12      public   double   GetUnitPrice()

13      {

14          return   10;

15      }

16 }

17  

18 public   class   LaborItem:BaseItem

19 {

20      public   string   GetEmployee()

21      {

22          return   100;

23      }

24 }

八、Extract Superclass(提炼超类)

动机(Motivation)

两个classes有相似特性(similar features)。为这两个classes建立一个superclass,将相同特性移至superclass。

示例

01 public   class   Department

02 {

03      public   double   GetAnnualCost()

04      {

05          return   1000;

06      }

07  

08      public   string   GetName()

09      {

10          return   "spring yang" ;

11      }

12  

13      public   double   GetHeadCount()

14      {

15          return   100;

16      }

17 }

18  

19 public   class   Employee

20 {

21      public   double   GetAnnualCost()

22      {

23          return   1000;

24      }

25  

26      public   string   GetName()

27      {

28          return   "spring yang" ;

29      }

30  

31      public   int   GetID()

32      {

33          return   1;

34      }

35 }

改为

01 public   class   LaborItem:BaseItem

02   {

03       public   string   GetEmployee()

04       {

05           return   100;

06       }

07   }

08  

09   public   class   Department:Party

10   {

11       public   double   GetHeadCount()

12       {

13           return   100;

14       }

15   }

16  

17   public   class   Employee:Party

18   {

19       public   int   GetID()

20       {

21           return   1;

22       }

23   }

24  

25   public   class   Party

26   {

27       public   double   GetAnnualCost()

28       {

29           return   1000;

30       }

31  

32       public   string   GetName()

33       {

34           return   "spring yang" ;

35       }

36   }

九、Extract Interface(提炼接口)

动机(Motivation)

若干客户使用class接口中的同一子集;或者,两个classes的接口有部分相同。将相同的子集提炼到一个独立接口中。

示例

01 public   class   Employee

02 {

03      public   double   GetRate()

04      {

05          return   1;

06      }

07  

08      public   bool   HasSpecialSkill()

09      {

10          return   true ;

11      }

12  

13      public   string   GetName()

14      {

15          return   "spring yang" ;

16      }

17  

18      public   string   GetDepartMent()

19      {

20          return   "Development" ;

21      }

22 }

改为

01 public   class   Employee:Billable

02 {

03      public   double   GetRate()

04      {

05          return   1;

06      }

07  

08      public   bool   HasSpecialSkill()

09      {

10          return   true ;

11      }

12  

13      public   string   GetName()

14      {

15          return   "spring yang" ;

16      }

17  

18      public   string   GetDepartMent()

19      {

20          return   "Development" ;

21      }

22 }

23  

24 public   interface   Billable

25 {

26      double   GetRate();

27      bool   HasSpecialSkill();

28 }

十、Collapse Hierarchy(折叠继承体系)

动机(Motivation)

superclass 和subclass之间无太大区别。将它们合为一体。

示例

01 public   class   Employee

02 {

03      public   string   GetName()

04      {

05          return   "spring yang" ;

06      }

07  

08      public   string   GetDepartMent()

09      {

10          return   "Development" ;

11      }

12 }

13  

14 public   class   Salesman

15 {

16      public   int   GetID()

17      {

18          return   1;

19      }

20 }

改为

01 public   class   Employee

02 {

03      public   string   GetName()

04      {

05          return   "spring yang" ;

06      }

07  

08      public   string   GetDepartMent()

09      {

10          return   "Development" ;

11      }

12  

13      public   int   GetID()

14      {

15          return   1;

16      }

17 }

步步为营 .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 代码重构学习笔记 十二

作者: Leo_wl

    

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

    

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

版权信息

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

  阅读:39次