zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    LUA脚本中的方法使用冒号和点,以及调用者使用冒号和点
    Lua类对象的继承
    Lua类对象和类对象的单例
    toLua使用protobuf协议转Lua表
    关于Lua表的弱引用
    Lua-面向对象中函数使用时冒号(:)和点(.)的区别
    Python【day 14-5】sorted filter map函数应用和练习
    Python【day 14-4】sorted filter map+递归文件夹+二分法查找
    Python【day 14-3】二分法查找
    Python【day 14-2】递归遍历文件夹
  • 原文地址:https://www.cnblogs.com/qisheng/p/2340348.html
Copyright © 2011-2022 走看看