通过函数对象(method object)抽取大函数
在重构代码时,如果遇到大函数需要分拆,抽取的情况。而函数里面又有许多临时变量,参数等相互纠缠不清,使得不好分拆。虽然replace temp with query可以缓解一点困难,但还是不够,于是Kent Beck等高人出手祭出了夺命刀----函数对象。
我还太菜,这也不是什么技术文章,只是自己的一点记录,于是还是把示例烂代码贴出来,做个记录。
class handler
{
public:
int func(int input1,int input2,int& out)
{
int tmp1 = input1 + input2;
int tmp2 = input1 * input2;
out = tmp1/tmp2;
printf("tmp1: %d\n",tmp1);
printf("tmp2: %d\n",tmp2);
value1 = tmp1 + input1;
value2 = tmp2 + out;
return tmp1 + tmp2 + out;
}
void setValue1(int value)
{
value1 = value;
}
void setValue2(int value)
{
value2 = value;
}
private:
int value1;
int value2;
};
class func
{
public:
func(handler* hh, int in1,int in2,int& ou)
{
input1 = in1;
input2 = in2;
out = ou;
h = hh;
}
int compute()
{
tmp1 = input1 + input2;
tmp2 = input1 * input2;
out = tmp1/tmp2;
h->setValue1(tmp1 + input1);
h->setValue2(tmp2 + out);
print();
return tmp1 + tmp2 + out;
}
void print()
{
printf("tmp1: %d\n",tmp1);
printf("tmp2: %d\n",tmp2);
}
private:
handler* h;
int out;
int tmp1;
int tmp2;
int input1;
int input2;
};
class func 就是handler中的成员函数func的函数对象。
func函数中的参数和操作都封住到class func中去了。
在func函数中用到了handler类的功能,都通过传给func class的handler指针来提供。
看起来不错!嘎嘎
阅读(744) | 评论(0) | 转发(0) |