Chinaunix首页 | 论坛 | 博客
  • 博客访问: 323127
  • 博文数量: 100
  • 博客积分: 2620
  • 博客等级: 少校
  • 技术积分: 920
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-16 02:50
文章分类

全部博文(100)

文章存档

2011年(5)

2010年(12)

2009年(83)

分类:

2009-12-03 22:26:22

通过函数对象(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指针来提供。
看起来不错!嘎嘎
阅读(714) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~