`

用方法对象取代方法

阅读更多

转自:http://chaimzane.iteye.com/blog/321951

七 Replace Methord with Method Object

 

 你有个大型函数,其中对局部变量的使用,使你无法采用Extact Method .

 

 动机:小型函数具有其优美动人之处,只要将它重大型函数中提炼出来,就可以大大提高代码的可阅读性。但是局部变量的存在会增加分解函数的难度。ReplaceTemporary with qury 可以帮助你减轻这一负担,但是有时候你会发现根本无法拆解需要拆解的函数。这时,你就应该祭出 函数对象(Method object)这件法宝。将所有的函数对象都变成函数对象的值域。然后你及可以对这个新对象用 Extract Method创造出新函数,从而使原来的大型函数拆解变短。

 

例子:

class Account 
{   
       public int  gamma(int inputVal, int quantity, int yearToDate) 
      {   
            int importantValue1 = (inputVal * quantity) + delta();   
            int importantValue2 = (inputVal * yearToDate) + 100;   
          
            if ((yearToDate - importValue1) > 100) 
           {   
                  importValue2 -= 20;   
           }   
  
           int importantValue3 = importValue2 * 7;   
          
         //等等
         return imortantValue3 - 2 * importantValue1;   
}  

 

 =>为了把这函数变成一个函数对象,首先要声明一个新的Class

 

class Gamma 
{
    private Account account ;   
    private int inputVal;   
    private int quantity;   
    private int yearToDate;   
    private int importtantantValue1;   
    private int importtantantValue2;   
    private int importtantantValue3;   
  
    public Gamma (Account souce, int inputValArg,   
                           int quantityArg, int yearToDateArg) 
   {   
           
        account = souce;   
        inputVal = inputValArg;   
        quantity = quantityArg;   
        yearToDate = yearToDateArg;   
   }   
  
    public int  compute()
    {   
        importtantantValue1 = (inputVal  * quantity) + account.delta();   
        importtantantValue2 = (inputVal  * yearToDate ) + 100;   
        
       if (( yearToDate - importantValue) > 100 ) 
      {   
            importtantantValue2   -= 20;   
      }   
  
         importantValue3 = importantValue2 * 7;   
  
         return importantValue3 - 2*  importantValue1;   
   } 

 

class Account 
{
    public int  gamma(int inputVal, int quantity, int yearToDate)
   {   
        return new Gamma(this, inputVal, quantity, yearToDate).compute();   
    }
}  

 

 

  这样一来,我们就可以轻松的对 compute()进行 Extract Method而不必担心 引数的传递

分享到:
评论

相关推荐

    js_Window对象及方法

    "js_Window对象及方法" window 对象是客户端 JavaScript 最高层对象之一,只要打开浏览器窗口,不管该窗口中是否有打开的...但是,在事件处理中调用 location 属性、close() 方法或 open() 方法时必须使用实例名称。

    asp.net内置对象方法

    9. **HttpApplicationState对象**(在ASP.NET 2.0及以上版本中,大部分功能已被Application对象取代):早期版本中用于存储应用程序级的状态信息。 10. **Page对象**:对于ASP.NET Web Forms,Page对象是每个页面的...

    结构化方法与面向对象方法的比较分析 (2001年)

    结构化方法虽然成熟,但面向对象方法因为其对现实世界建模的强大能力,已经在很多领域逐步取代了结构化方法。 本文的结论是,在选用面向对象方法开发大型软件系统的同时,可以适当结合结构化方法的优点。尽管面向...

    java面向对象试题

    6.面向对象方法不包括过程调用。 7.错误的是接口与类的层次无关,实际上,接口和类存在继承关系。 8.JAVA 中能实现多重继承效果的方式是通过接口实现的。 关于 final 访问修饰符: * final 访问修饰符代表此类或...

    Java面向对象-笔记.docx

    * 使用this的注意:this是在对象内部只带自身的引用.this只能调用实例变量、实例方法和实例构造方法.this不能调用类变量和类方法,this也不能调用局部变量。 十二、方法的重载 * 同一个类中。 * 方法名相同。 * ...

    Jquery对象集合

    当在jQuery对象集合上调用方法时,方法内部的`this`关键字指向当前处理的DOM元素。这使得在循环中操作元素变得简单。 6. **方法的参数** 许多jQuery方法接受参数,允许我们定制操作。例如,`fadeIn()`方法可以...

    使用候选对象对齐的对象检测(2).zip

    传统的对象检测方法如滑动窗口和区域提议网络(Region Proposal Networks, RPNs)已经逐步被基于深度学习的方法取代,这些方法能够端到端地学习对象检测,如Fast R-CNN、Faster R-CNN和YOLO系列。 二、候选对象对齐...

    面向对象编程与非面向对象编程

    面向对象编程是一种编程思想,它将程序中的各种实体视为对象,每个对象都包含状态(属性)和行为(方法),并通过对象间的交互来完成特定功能。OOP的核心特性包括: - **封装**:封装是将数据和操作数据的方法绑定...

    Java对象内存布局 - 小分析

    理解对象内存布局有助于优化程序性能,例如减少对象创建、理解和使用对象池,或者通过调整JVM参数来改善垃圾回收效率。`SizeOfAgent.java`、`Rule1.java`和`Rule2.java`可能包含了用于分析对象大小的代码,而`rule1....

    用js创建XMLHttpRequest对象池

    2. **获取并使用对象**:当需要发送请求时,从对象池中取出一个未使用的XHR对象。如果所有对象都在使用中,则等待直到有对象可用。可以使用`Promise`来实现阻塞式获取: ```javascript function getAvailableXHR()...

    面向对象分析与设计课件

    面向对象分析阶段,使用用例图、活动图来捕获用户需求,这些模型在需求变化时比传统的功能模型更具稳定性。设计阶段则通过类图、序列图等进一步细化系统结构。面向对象方法鼓励使用自然语言编程,如Java,以提高代码...

    自动化对象模型参考.rar

    自动化对象模型是自动化测试工具QuickTest Professional(QTP,现已被UFT统一功能测试取代)的核心组成部分,它允许用户通过编程方式与应用程序的各个对象进行交互。本压缩包"自动化对象模型参考.rar"包含了关于QTP...

    面向对象的软件构造.pdf

    文档中提到,“面向对象”是最新的流行术语,补充甚至在很多情况下取代了“结构化”作为高科技版本中的“优秀”。面向对象编程之所以受到重视,主要有以下几个原因: 1. **灵活性与扩展性**:面向对象编程允许...

    OLE 2 对象链接与嵌入技术高级编程技术

    8. **剪贴板和数据交换 (Clipboard and Data Exchange)**:OLE 2 提供了一种标准机制来在应用程序之间共享数据,通过剪贴板或者数据对象的使用,数据可以在不同程序间复制、粘贴。 9. **持久化 (Persistence)**:...

    复习资料(基础班)1

    8. **Java内存分布**:在Java程序中,内存主要分为栈、堆、方法区(在Java 8后被元空间取代)、本地方法区和寄存器。栈存储方法调用的局部变量,堆存储对象实例,方法区存储类的信息,本地方法区处理JNI调用,寄存器...

    JAVASCRIPTUMENT对象属性和方法[文].pdf

    然而,随着Web技术的发展,许多旧的属性和方法已经被更现代、更强大的CSS和DOM API所取代。因此,了解并熟练掌握`document`对象的同时,也要关注Web标准的最新进展,以便编写更高效、更符合现代规范的代码。

    面向对象Javascript核心支持代码分享

    但在这段核心支持代码中,我们看到的是对旧版JavaScript编程模式的反映,尽管这些模式已经在很大程度上被新的语法和工具取代,但在学习和理解JavaScript面向对象编程的发展历程方面,它们仍然具有重要价值。...

    类对象的创建及内存解析

    在Java 8之后,原本的方法区被元空间取代,元空间主要存储类加载的信息。 对象的内存管理还包括垃圾收集(Garbage Collection, GC)。Java的自动内存管理机制会追踪不再使用的对象,并回收它们占用的内存。这确保了...

    w3 JMial的 SmtpMail 对象的属性和方法

    综上所述,虽然`SmtpMail`对象已经被更为先进的`Message`对象所取代,但对于那些仍在运行旧版本系统的用户来说,了解并掌握它的使用方法仍然是非常有价值的。通过本文档的学习,希望读者能够更好地理解和运用`...

Global site tag (gtag.js) - Google Analytics