好得很程序员自学网

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

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

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

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

 

一、Remove Control Flag(移除控制标记)

动机(Motivation)

以break语句或return语句取代控制标记。

示例

01 public   void   CheckSecurity( string [] people)

02 {

03      string   found =  string .Empty;

04      for   ( int   i = 0; i < people.Length; i++)

05      {

06          if   (found.Equals( "" ))

07          {

08              if   (people[i].Equals( "Don" ))

09              {

10                  found =  "Don" ;

11              }

12              if   (people[i].Equals( "John" ))

13              {

14                  found =  "John" ;

15              }

16          }

17      }

18      SomeDataCode(found);

19 }

改为

01 public   void   CheckSecurity( string [] people)

02 {

03      string   found =  string .Empty;

04      for   ( int   i = 0; i < people.Length; i++)

05      {

06          if   (found.Equals( "" ))

07          {

08              if   (people[i].Equals( "Don" ))

09              {

10                  found =  "Don" ;

11                  break ;

12              }

13              if   (people[i].Equals( "John" ))

14              {

15                  found =  "John" ;

16                  break ;

17              }

18          }

19      }

20      SomeDataCode(found);

21 }

示例

01 public   string   FindPeople( string [] people)

02 {

03      string   found =  string .Empty;

04      for   ( int   i = 0; i < people.Length; i++)

05      {

06          if   (found.Equals( "" ))

07          {

08              if   (people[i].Equals( "Don" ))

09              {

10                  found =  "Don" ;                     

11              }

12              if   (people[i].Equals( "John" ))

13              {

14                  found =  "John" ;                     

15              }

16          }

17      }

18      return   found;

19 }

改为

01 public   string   FindPeople( string [] people)

02 {

03      string   found =  string .Empty;

04      for   ( int   i = 0; i < people.Length; i++)

05      {

06          if   (found.Equals( "" ))

07          {

08              if   (people[i].Equals( "Don" ))

09              {

10                  return   "Don" ;

11              }

12              if   (people[i].Equals( "John" ))

13              {

14                  return   "John" ;

15              }

16          }

17      }

18      return   string .Empty;

19 }

二、Replace Nested Conditional with Guard Clauses(以卫语句取代嵌套条件式)

动机(Motivation)

使用卫语句(guard clauses)表现所有特殊情况。

示例

01 public   double   GetPayAmount()

02 {

03      double   result;

04      if   (IsDead)

05          result = DeadAmount();

06      else

07      {

08          if   (IsSeparated)

09              result = SeparatedAmount();

10          else

11          {

12              if   (IsRetired)

13                  result = RetiredPayAmount();

14              else

15                  result = NormalPayAmount();

16          }

17      }

18      return   result;

19 }

改为

01 public   double   GetPayAmount()

02 {

03      if   (IsDead)

04          return   DeadAmount();

05      if   (IsSeparated)

06          return   SeparatedAmount();

07      if   (IsRetired)

08          return   RetiredPayAmount();

09      return   NormalPayAmount();

10 }

三、Introduce Null Object (引入Null对象)

动机(Motivation)

将null value(无效值)替换为null object(无效物)

示例

1 if   (customer ==  null )

2      plan = BillingPlan.Basic();

3 else

4      plan = customer.GetPlan();

改为

1 public   double   GetPayAmount()

2 {

3      if   (customer.IsNull())

4          plan = BillingPlan.Basic();

5      else

6          plan = customer.GetPlan();

7 }

四、Rename Method(重新命名函数)

动机(Motivation)

修改函数名称让它人容易理解它的作用

示例

1 public   int   Getinvcdtlmt()

2 {

3      return   10;

4 }

改为

1 public   int   GetInvoiceAbleCreditLimit()

2 {

3      return   10;

4 }

五、Separate Query from Modifier(将查询函数和修改函数分离)

动机(Motivation)

建立两个不同的函数,其中一个负责查询,另一个负责修改。

示例

01 public   string   FindPeople( string [] people)

02 {

03      string   found =  string .Empty;

04      for   ( int   i = 0; i < people.Length; i++)

05      {

06          if   (found.Equals( "" ))

07          {

08              if   (people[i].Equals( "Don" ))

09              {

10                  SendMail();

11                  return   "Don" ;

12              }

13              if   (people[i].Equals( "John" ))

14              {

15                  SendMail();

16                  return   "John" ;

17              }

18          }

19      }

20      return   string .Empty;

21 }

改为

01 public   string   FindPeople( string [] people)

02 {

03      string   found = FindPeopleOne(people);

04      SendMailToPeople(found);

05 }

06  

07 public   string   FindPeopleOne( string [] people)

08 {

09      string   found =  string .Empty;

10      for   ( int   i = 0; i < people.Length; i++)

11      {

12          if   (found.Equals( "" ))

13          {

14              if   (people[i].Equals( "Don" ))

15              {

16                  return   "Don" ;

17              }

18              if   (people[i].Equals( "John" ))

19              {

20                  return   "John" ;

21              }

22          }

23      }

24      return   string .Empty;

25 }

26  

27 public   void   SendMailToPeople( string   people)

28 {

29      if   (! string .IsNullOrEmpty(people))

30          SendMail();

31 }

六、Parameterize Method(令函数携带参数)

动机(Motivation)

建立单一函数,以参数表达那些不同的值

示例

1 public   double   TenPercentRaise()

2 {

3      return   salary * 1.1;

4 }

5  

6 public   double   FivePercentRaise()

7 {

8      return   salary * 1.05;

9 }

改为

1 public   double   Raise( double   factor)

2 {

3      return   salary * factor;

4 }

七、Replace Parameter with Explicit Methods(以明确函数取代参数)

动机(Motivation)

针对该参数的每一个可能值,建立一个独立函数。

示例

01 private   int   _height;

02 private   int   _width;

03  

04 public   void   SetValue( string   name,  int   value)

05 {

06      if   (name.Equals( "height" ))

07      {

08          _height = value;

09          return ;

10      }

11      if   (name.Equals( "width" ))

12      {

13          _width = value;

14          return ;

15      }

16 }

改为

view source print ?

01 private   int   _height;

02 private   int   _width;

03  

04 public   int   Height

05 {

06      set   { _height = value; }

07 }

08  

09 public   int   Width

10 {

11      set   { _width = value; }

12 }

作者: Leo_wl

    

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

    

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

版权信息

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

  阅读:41次