重构--Extract Method方法[自己理解的]

    从今天开始我们就来说说重构的各种方法了.我不会去按照书上写的一个一个方法一直写下去,我会根据
自己在实际项目中用到的方法来写,这样会更好的理解如何使用重构来改善我们的代码.
    首先我们要介绍的是重构中最常用的方法,也是该书的作者经常使用的方法.
Extract Method方法
    将函数中过长的代码提炼出来,然后组织在一起并独立到一个新的独立方法中,并让方法名称解释该方法
的用途.该方法最好之处是有效的减少了方法中的代码.

实例代码如下:
 1  private   string  myName;
 2  public   void  printPeople( int  Age)
 3  {
 4      printFamily();
 5       // 无数代码 //
 6 
 7       // 打印个人信息
 8      Console.WriteLine( " Name: "   +  myName);
 9          Console.WriteLine( " Age: "   +  Age);
10  }

重构后的代码如下:
 1  private   string  myName;
 2  public   void  printPeople( int  Age)
 3  {
 4      printFamily();
 5       // 无数代码 //
 6      printMyInfo(Age);
 7  }
 8 
 9  void  printMyInfo( int  Age)
10  {
11      Console.WriteLine( " Name: "   +  myName);
12          Console.WriteLine( " Age: "   +  Age);
13  }

为什么要这样重构?当一个函数很大的时候,第一对代码的修改起来非常的不方便.
第二,会对你读代码有障碍,试想一下当你看到一个很多行代码的方法,你还有心情看下去吗?
第三,方法与方法之间的复用性会非常的好,方法的重写也会更容易些.

那么我们应该怎么做呢?
看第一个例子:
无局部变量的方法提炼.
 1  void  printOwing()
 2  {
 3      ArrayList al  =  myOrders.GetOrderList();
 4       double  outstanding  =   0.0 ;
 5 
 6       // 打印头部信息
 7      Console.WriteLine( " ***************** " );
 8      Console.WriteLine( " **Customer Owes** " );
 9      Console.WriteLine( " ***************** " );
10 
11       // 计算
12       foreach (Object o  in  al)
13      {
14          Order each  =  (Order)o;
15          outstanding  +=  each.Amount;
16      }
17 
18       // 打印具体信息
19      Console.WriteLine( " Name: "   +  myName);
20      Console.WriteLine( " Age: "   +  age);
21  }

好了我们开始先提最简单的部分.提出后的代码如下:
 1  void  printOwing()
 2  {
 3      ArrayList al  =  myOrders.GetOrderList();
 4       double  outstanding  =   0.0 ;
 5 
 6      printBanner();
 7 
 8       // 计算
 9       foreach (Object o  in  al)
10      {
11          Order each  =  (Order)o;
12          outstanding  +=  each.Amount;
13      }
14 
15       // 打印具体信息
16      Console.WriteLine( " Name: "   +  myName);
17      Console.WriteLine( " Age: "   +  age);
18  }
19 
20  void  printBanner()
21  {
22       // 打印头部信息
23      Console.WriteLine( " ***************** " );
24      Console.WriteLine( " **Customer Owes** " );
25      Console.WriteLine( " ***************** " );
26  }

最简单的提炼方法结束了.
下来我们看有局部变量的方法提炼.就拿上面的的代码开刀.
 1  void  printOwing()
 2  {
 3      ArrayList al  =  myOrders.GetOrderList();
 4       double  outstanding  =   0.0 ;
 5 
 6      printBanner();
 7 
 8       // 计算
 9       foreach (Object o  in  al)
10      {
11          Order each  =  (Order)o;
12          outstanding  +=  each.Amount;
13      }
14 
15      printInfo(outstanding);
16  }
17 
18  void  printBanner()
19  {
20       // 打印头部信息
21      Console.WriteLine( " ***************** " );
22      Console.WriteLine( " **Customer Owes** " );
23      Console.WriteLine( " ***************** " );
24  }
25 
26  void  printInfo( double  OutStanding)
27  {
28       // 打印具体信息
29      Console.WriteLine( " Name: "   +  myName);
30      Console.WriteLine( " Age: "   +  age);   
31  }

我们再来看下对局部变量再赋值方法的提炼.继续拿上面代码开刀.
 1  void  printOwing()
 2  {
 3       double  outstanding  =  GetOutStanding();
 4 
 5      printBanner();
 6 
 7      printInfo(outstanding);
 8  }
 9 
10  void  printBanner()
11  {
12       // 打印头部信息
13      Console.WriteLine( " ***************** " );
14      Console.WriteLine( " **Customer Owes** " );
15      Console.WriteLine( " ***************** " );
16  }
17 
18  void  printInfo( double  OutStanding)
19  {
20       // 打印具体信息
21      Console.WriteLine( " Name: "   +  myName);
22      Console.WriteLine( " Age: "   +  age);   
23  }
24 
25  double  GetOutStanding()
26  {
27      ArrayList al  =  myOrders.GetOrderList();
28       double  outstanding  =   0.0 ;
29       // 计算
30       foreach (Object o  in  al)
31      {
32          Order each  =  (Order)o;
33          outstanding  +=  each.Amount;
34      }
35       return  outstanding
36  }

Extract Method方法讲解玩了.有人会问为什么要这样写?这样写的好处我没有看到啊.
那么现在有个这样的需求,我要设置outstanding的初始值,那么我们只要修改GetOutStanding方法,代码

如下:
 1  double  GetOutStanding( double  previousAmount)
 2  {
 3      ArrayList al  =  myOrders.GetOrderList();
 4       double  outstanding  =  previousAmount;
 5       // 计算
 6       foreach (Object o  in  al)
 7      {
 8          Order each  =  (Order)o;
 9          outstanding  +=  each.Amount;
10      }
11       return  outstanding
12  }

主要方法修改如下:
1  void  printOwing()
2  {
3       double  outstanding  =  GetOutStanding( 500.5 );
4 
5      printBanner();
6 
7      printInfo(outstanding);
8  }

如果需求继续增加,我们修改起来是不是方便了许多?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值