转自: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对象及方法" window 对象是客户端 JavaScript 最高层对象之一,只要打开浏览器窗口,不管该窗口中是否有打开的...但是,在事件处理中调用 location 属性、close() 方法或 open() 方法时必须使用实例名称。
9. **HttpApplicationState对象**(在ASP.NET 2.0及以上版本中,大部分功能已被Application对象取代):早期版本中用于存储应用程序级的状态信息。 10. **Page对象**:对于ASP.NET Web Forms,Page对象是每个页面的...
结构化方法虽然成熟,但面向对象方法因为其对现实世界建模的强大能力,已经在很多领域逐步取代了结构化方法。 本文的结论是,在选用面向对象方法开发大型软件系统的同时,可以适当结合结构化方法的优点。尽管面向...
6.面向对象方法不包括过程调用。 7.错误的是接口与类的层次无关,实际上,接口和类存在继承关系。 8.JAVA 中能实现多重继承效果的方式是通过接口实现的。 关于 final 访问修饰符: * final 访问修饰符代表此类或...
* 使用this的注意:this是在对象内部只带自身的引用.this只能调用实例变量、实例方法和实例构造方法.this不能调用类变量和类方法,this也不能调用局部变量。 十二、方法的重载 * 同一个类中。 * 方法名相同。 * ...
当在jQuery对象集合上调用方法时,方法内部的`this`关键字指向当前处理的DOM元素。这使得在循环中操作元素变得简单。 6. **方法的参数** 许多jQuery方法接受参数,允许我们定制操作。例如,`fadeIn()`方法可以...
传统的对象检测方法如滑动窗口和区域提议网络(Region Proposal Networks, RPNs)已经逐步被基于深度学习的方法取代,这些方法能够端到端地学习对象检测,如Fast R-CNN、Faster R-CNN和YOLO系列。 二、候选对象对齐...
面向对象编程是一种编程思想,它将程序中的各种实体视为对象,每个对象都包含状态(属性)和行为(方法),并通过对象间的交互来完成特定功能。OOP的核心特性包括: - **封装**:封装是将数据和操作数据的方法绑定...
理解对象内存布局有助于优化程序性能,例如减少对象创建、理解和使用对象池,或者通过调整JVM参数来改善垃圾回收效率。`SizeOfAgent.java`、`Rule1.java`和`Rule2.java`可能包含了用于分析对象大小的代码,而`rule1....
2. **获取并使用对象**:当需要发送请求时,从对象池中取出一个未使用的XHR对象。如果所有对象都在使用中,则等待直到有对象可用。可以使用`Promise`来实现阻塞式获取: ```javascript function getAvailableXHR()...
面向对象分析阶段,使用用例图、活动图来捕获用户需求,这些模型在需求变化时比传统的功能模型更具稳定性。设计阶段则通过类图、序列图等进一步细化系统结构。面向对象方法鼓励使用自然语言编程,如Java,以提高代码...
自动化对象模型是自动化测试工具QuickTest Professional(QTP,现已被UFT统一功能测试取代)的核心组成部分,它允许用户通过编程方式与应用程序的各个对象进行交互。本压缩包"自动化对象模型参考.rar"包含了关于QTP...
文档中提到,“面向对象”是最新的流行术语,补充甚至在很多情况下取代了“结构化”作为高科技版本中的“优秀”。面向对象编程之所以受到重视,主要有以下几个原因: 1. **灵活性与扩展性**:面向对象编程允许...
8. **剪贴板和数据交换 (Clipboard and Data Exchange)**:OLE 2 提供了一种标准机制来在应用程序之间共享数据,通过剪贴板或者数据对象的使用,数据可以在不同程序间复制、粘贴。 9. **持久化 (Persistence)**:...
8. **Java内存分布**:在Java程序中,内存主要分为栈、堆、方法区(在Java 8后被元空间取代)、本地方法区和寄存器。栈存储方法调用的局部变量,堆存储对象实例,方法区存储类的信息,本地方法区处理JNI调用,寄存器...
然而,随着Web技术的发展,许多旧的属性和方法已经被更现代、更强大的CSS和DOM API所取代。因此,了解并熟练掌握`document`对象的同时,也要关注Web标准的最新进展,以便编写更高效、更符合现代规范的代码。
但在这段核心支持代码中,我们看到的是对旧版JavaScript编程模式的反映,尽管这些模式已经在很大程度上被新的语法和工具取代,但在学习和理解JavaScript面向对象编程的发展历程方面,它们仍然具有重要价值。...
在Java 8之后,原本的方法区被元空间取代,元空间主要存储类加载的信息。 对象的内存管理还包括垃圾收集(Garbage Collection, GC)。Java的自动内存管理机制会追踪不再使用的对象,并回收它们占用的内存。这确保了...
综上所述,虽然`SmtpMail`对象已经被更为先进的`Message`对象所取代,但对于那些仍在运行旧版本系统的用户来说,了解并掌握它的使用方法仍然是非常有价值的。通过本文档的学习,希望读者能够更好地理解和运用`...