重构——8以函数对象取代函数(Replace Method with Method Object)

以函数对象取代函数(Replace Method with Method Object)

有一个大型函数,其中对局部变量的使用使你无法采用Extract Method。将这个函数放进一个单独的对象里中,如此一来局部变量就成了对象内的字段,然后你就可以在同一个对象中将这个大型函数分解为多个小型函数

一、动机

1、小函数优美动人,只要将相对独立的代码从大型函数中提炼出来,就可以大大提高代码的可读性

2、局部变量的存在会增加函数分解难度。如果一个函数之中局部变量泛滥成灾,那么想分解这个函数是非常困难的

二、做法

1、建立一个新类,根据待处理函数的用途,为这个类命名

2、在新类中建立一个final字段,用以保存原先大型函数所在的对象,我们将这个对象称为“源对象”。同时,针对原函数的每个临时变量和每个参数,在新类中建立一个对应的字段保存之。

3、在新类中建立一个构造函数,接收源对象及原函数的所有参数作为参数

4、在新类中建立一个compute()函数

5、将原函数的代码复制到compute()函数中。如果需要调用源对象的任何函数,请通过源对象字段调用。

6、编译

7、将就函数的函数本体替换为这样一条语句:创建上述新类的一个新对象,而后调用其中的compute()函数

时间: 2024-10-24 17:08:33

重构——8以函数对象取代函数(Replace Method with Method Object)的相关文章

函数对象-sort函数的第三个参数有什么用

问题描述 sort函数的第三个参数有什么用 sort函数原先是升序排列为什么加入一个人自己定义的compare函数之后就会降序了呢?小白愚钝,希望大神讲得详细一点,不胜感激 解决方案 排序的数据类型不局限于整数,只要是定义了小于运算的类型都可以,比如字符串类string.如果是没有定义小于运算的数据类型,或者想改变排序的顺序,就要用到第三参数--比较(compare)函数.比较函数是一个自己定义的函数,返回值是bool型,它规定了什么样的关系才是"小于".比较时sort函数根据comp

python进阶教程之函数对象(函数也是对象)_python

秉承着一切皆对象的理念,我们再次回头来看函数(function).函数也是一个对象,具有属性(可以使用dir()查询).作为对象,它还可以赋值给其它对象名,或者作为参数传递. lambda函数 在展开之前,我们先提一下lambda函数.可以利用lambda函数的语法,定义函数.lambda例子如下: 复制代码 代码如下: func = lambda x,y: x + y print func(3,4) lambda生成一个函数对象.该函数参数为x,y,返回值为x+y.函数对象赋给func.fun

C++中的函数指针与函数对象的总结

以下是对C++中的函数指针与函数对象的使用进行了详细的分析介绍,需要的朋友可以参考下   篇一.函数指针函数指针:是指向函数的指针变量,在C编译时,每一个函数都有一个入口地址,那么这个指向这个函数的函数指针便指向这个地址. 函数指针的用途是很大的,主要有两个作用:用作调用函数和做函数的参数. 函数指针的声明方法:数据类型标志符 (指针变量名) (形参列表): 一般函数的声明为: int func ( int x );而一个函数指针的声明方法为:int (*func) (int x);前面的那个(

C++中的函数指针和函数对象总结

篇一.函数指针函数指针:是指向函数的指针变量,在C编译时,每一个函数都有一个入口地址,那么这个指向这个函数的函数指针便指向这个地址.函数指针的用途是很大的,主要有两个作用:用作调用函数和做函数的参数.函数指针的声明方法:数据类型标志符 (指针变量名) (形参列表):一般函数的声明为: int func ( int x );而一个函数指针的声明方法为:int (*func) (int x);前面的那个(*func)中括号是必要的,这会告诉编译器我们声明的是函数指针而不是声明一个具有返回型为指针的函

定义函数对象

尽管函数指针被广泛用于实现函数回调,但C++还提供了一个重要的实现回调函数的方法,那就是函数对象.函数对象(也称"算符")是重载了"()"操作符的普通类对象.因此从语法上讲,函数对象与普通的函数行为类似. 用函数对象代替函数指针有几个优点,首先,因为对象可以在内部修改而不用改动外部接口,因此设计更灵活,更富有弹性.函数对象也具备有存储先前调用结果的数据成员.在使用普通函数时需要将先前调用的结果存储在全程或者本地静态变量中,但是全程或者本地静态变量有某些我们不愿意看到

C++指针探讨(四)函数对象

函数对象不是函数指针.但是,在程序代码中,它的调用方式与函数指针一样,后面加个括号就可以了. 这是入门级的随笔,说的是函数对象的定义,使用,以及与函数指针,成员函数指针的关系. 沐枫小筑 函数对象实质上是一个实现了operator()--括号操作符--的类. 例如: class Add { public: int operator()(int a, int b) { return a + b; } }; Add add: // 定义函数对象 cout << add(3,2): // 5 函数指

c++中关于函数对象的问题

问题描述 c++中关于函数对象的问题 比如说用了bind2nd把<和2绑在一起,最后这个函数的 返回值是一个元操作符,就是( ),2))balabala.... 解决方案 C++函数对象[C++]函数对象(一)C++函数对象-谓词 解决方案二: http://blog.csdn.net/starlee/article/details/1486327

C++程序设计:原理与实践(进阶篇)16.4 函数对象

16.4 函数对象 因此,我们希望向f?ind_if()传递断言,同时希望断言能够将元素与以参数形式传递的值进行比较.特别地,我们希望能编写如下形式的代码:   显然,Larger_than必须满足如下条件: 能作为断言被调用,例如,pred(*f?irst): 能够存储一个数值,例如31或x,以备调用时使用. 为了满足这些条件,我们需要"函数对象",即一种能够实现函数行为的对象.我们需要对象的原因是对象能够存储数据,例如待比较的值.举例来说:   有趣的是,此定义就能使前面的例子正常

重构——22以对象取代数组(Replace Array with Object)

以对象取代数组(Replace Array with Object) 你有一个数组,其中的元素各自代表不同的东西:以对象替换数组.对于数组中的每个元素,以一个字段来表示 一.动机 数组应该只用于"以某种顺序容纳一组相似对象" 二.做法 1.新建一个类表示数组所拥有的信息,并在其中以一个public字段保存原先的数组 2.修改数组的所有用户,让它们改用新类的实例 3.编译,测试 4.逐一为数组元素添加取值/设值函数.根据元素的用途,为这些访问函数命名.修改客户端代码,让它们通过访问函数取