`
liuzongan
  • 浏览: 92968 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

重构之提炼代码

阅读更多

前几天北京图书大厦买了两本书<<重构,改善既有代码的设计>>与<<agile with="" web="" development="" rails=""></agile>><agile with="" web="" development="" rails=""></agile>

特意把书的代码一个字一个字粘出来,望能帮助我们这些开发人员对"重构"理解提供一些帮助,

当你有一段代码可以被组织在一起独立出来

将这段代码放进一个独立函数中,并让函数名称解释该函数的用途

函数的命名是非常重要的,以前我做开发的时候,从来我就不考虑这么多,只要这个函数能跑起来就行,我也不去管那么多,现在看了"重构",感觉它有另外一种思想,望大家好好学习!!

java 代码
  1. void  printOwing(double amonut){   
  2. printBanner();   
  3. //print details
  4. System.out.println("name:"+_name);
  5. System.out.println(""amount:"+amount);
  6.   
  7. }  

 

重构后的代码:

java 代码
  1. void printOwing(double amonut){   
  2.      printBanner();
  3.      printDetails(amount
  4. }  
  5. void printDetails(double amount){
         System.out.println("name:"+_name);
  6.      System.out.println("amount:"+amount);
  7. }

可以看出现在变成了两个方法,把一部分语句抽出来做为一个方法!!

Extract Method 是最常见的重构方法之一。看见一个过长的函数或者一段需要注释才能让人理解用途的代码,就会将这个段代码放进一个独立函数中。

有数个原因造成简短面有良好的命名的函数。首先,如果每个函数的粒度都江堰市很小(finely grained),那么函数之间彼此复用的机会就更大了,其次,这会使高层函数代码读起来就像一系列注释;再者,如果函数都是细粒度,那么函数的覆写(override)也会更容易些.

作法:

  • 创造一个新函数,根据这个函数的意图来给它命名
  • 仔细检查提炼出的代码,看看其中是否引用了(作用域限于源函数)的变量(包括局部变量和源函数参数)
  • 检查是否有(仅仅用于被提炼代码)的临时变量,如果有,在目标函数中将它们声明为临时变量
  • 检查被提炼码,看看是否有任何局部变量的值被它改变,如果一个临时变量值被修改了,看看是否可以将被提炼码处理为一个查询(Query),并将结果值给相关变量,
  • 将被提炼代码中需要读取的局部变量,当作函数传给目标函数

范例1):无局部变量(No  Local Variables)

java 代码
  1. void printOwing()
  2. {     
  3.      Enumeration e =_orders.elements();
  4.      double outstanding=0.0;   
  5.  
  6.      //calculate outstanding 
  7.      System.out.println("*******************************"); 
  8.      System.out.println("********* Customer Owes********"); 
  9.      System.out.pritnln("*******************************");
  10.      
  11.      //calculate outstanding
  12.      while(e.hasMoreElements()
  13.      {
  14.           Order each=(Order)e.nextElement();
  15.           outstanding +=each.getAmount();
  16.    }
  17.  
  18.      //print details
  19.      System.out.println("name:"+_name);
  20.      System.out.println("amount:"+outstanding);
         
  21. }  

 重构后:

java 代码
  1. void printOwing(){   
  2.      Enumeration e=_orders.elements();  
  3.      double outstanding=0.0;
  4.      printBanner();
  5.      //calculate outstanding
  6.      while (e.hasMoreElements())
  7.      {
  8.            Order order=(Order)e.nextElement();
  9.            outstanding +=each.getAmount();
          } 
  10.  
  11.       //print details
  12.       System.out.println("name:"+_name);
  13.       System.out.println("amount:"+outstanding);
     
  14. }
  15.  
  16. void printBanner(){
  17.      //print banner
  18.      System.out.println("*******************************";
  19.      System.out.println("*********** Customer Owes *****");
  20.      System.out.println("*******************************"):
    }

 

范例2):对局部变量再赋值(Reassigning)

java 代码
  1. void printOwing(){   
  2.      printBanner();
  3.      double outstanding=getOutstanding();
  4.      printDetails(outstanding);
  5. }  
  6.  
  7. double getOutstanding()
  8. {
  9.    Enumeration e=_orders.elements();
  10.    while (e.hasMoreElements())
  11.    {
  12.       Order each=(Order)e.nextElement();
  13.       outstanding +=each.getAmount();
  14.     }
  15.    return outstanding;
    }

Enumeration 变量 e 只有被提炼码中用到,所以可以将它整个搬到新函数中,double 变量oustanding 在被提炼码内外都被用到,所以我必须让提炼的新函数返回它。

java 代码
  1. double getOutstanding()
  2. {   
  3.     Enumeration e=_orders.elements();
  4.     double result=0.0;
  5.     while(e.hasMoreElements())
  6.     {
  7.         Order each=(Order)e.nextElement();
  8.         result +=each.getAmount();
  9.      }
  10.     return result;
    }
  11.   

最后提炼成:

java 代码
  1. void print()   
  2. {   
  3.      printBanner();
  4.      double outstanding=getOutstanding();
  5.      printDetails(outstanding);
  6. }  
简单吧,呵呵
分享到:
评论

相关推荐

    重构_重构_改善既有代码_

    1. 提取函数(Extract Method):将大段代码提炼为一个独立的函数,使得代码更专注,更易于理解。 2. 内联函数(Inline Method):如果一个函数只在一个地方被调用,可以将其内容直接替换到调用位置,减少层次,提高...

    重构改善既有代码的设计第2版.pdf

    重构改善既有代码的设计第2版.pdf 本书主要讨论了如何通过重构来改善既有代码的设计,提高代码的可维护性、可读性和可扩展性。下面是对书中重要的知识点的总结: 1. 重构的定义和重要性:重构是指对既有代码的修改...

    重构改善既有代码的设计PPT课件

    例如,重复代码是常见的问题,可以通过提炼函数或应用设计模式如Template Method来消除。过长的函数降低了代码可读性,可以将其拆分为多个独立的功能。过大类的责任不明确,可以拆分为小类。过长的参数列表可以通过...

    重构----改善既有代码的设计(完整中文扫描版PDF)

    重构的过程包括了一系列的小步骤,比如:提取函数(Extract Method)、移除重复代码(Remove Duplication)、内联函数(Inline Method)、提炼类(Extract Class)、内联类(Inline Class)等。通过这些具体的重构...

    java代码重构经验分享

    Java 代码重构经验分享 Java 代码重构是指在不改变外部行为的情况下,修改代码的内部结构,以提高代码的可维护性、可读性和可扩展性。本文总结了 Java 代码重构的经验和技术规范,包括重构要求、重构的工作、代码的...

    软件工程中的代码重构技术.pptx

    - **提炼函数**:将函数的一部分代码抽取出来,形成一个新的独立函数。 - **搬移字段**:将一个类中的字段移动到另一个类中。 - **封装类**:为类中的字段和方法添加适当的访问控制修饰符。 - **内联方法**:将一个...

    看大师如何重构代码(java程序员必看)

    这是重构中最基础也是最常用的技术之一。 2. **重命名变量和方法**:选择更具有描述性的名称,可以使代码的意图更加明确,提高代码的可读性。 3. **提取类和接口**:当一个类承担了过多的责任时,可以考虑将其...

    java重构改善既有代码的设计

    3. **应用重构技术**:使用诸如提取方法、提炼类、替换条件为多态等重构技术。例如,当一个方法过长时,可以将其拆分为多个小方法;如果发现多个类有相似的职责,可能需要抽象出一个基类或者接口。 4. **验证结果**...

    《重构 改善既有代码的设计》之重构,第一个案例详解

    ### 《重构 改善既有代码的设计》之重构,第一个案例详解 #### 一、引言 《重构 改善既有代码的设计》是由Martin Fowler等人撰写的经典之作,旨在教授软件开发者如何通过重构来提高代码质量和可维护性。本书不仅...

    代码的重构,改善代码设计 refactor

    此外,重构还涉及到代码的提炼,这包括重拾面向对象的模式、封装新的方法、梳理继承关系、创建公共方法类以及移动方法。 合适的注释也是重构过程中的重要部分。注释应该包含业务和场景的说明、数据模型的说明以及...

    PHP 杂谈《重构-改善既有代码的设计》之一 重新组织你的函数

    经常重构可以帮助代码保持良好的结构和清晰性,保证代码能够被正确地放置在其最恰当的位置。此外,重构可以帮助开发者更容易地理解程序的工作原理,更快地找到潜在的bug,从而提高编码速度。 3. 重构的难点和风险 ...

    重构-改善既有代码的设计+中文版.pdf 侯捷 侯俊杰

    《重构-改善既有代码的设计》是由Martin Fowler所著的一本软件工程领域的经典书籍,中文版由侯捷翻译,与《设计模式》齐名,被广泛认为是软件开发人员提升编程技能的必读之作。书中展示了超过70种行之有效的重构方法...

    重构改善既有代码的设计(PDF)

    《重构改善既有代码的设计》这本书主要介绍如何在现有的代码基础上进行重构以改善设计。重构,即对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。本书以Java语言...

Global site tag (gtag.js) - Google Analytics