Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1062296
  • 博文数量: 264
  • 博客积分: 6005
  • 博客等级: 大校
  • 技术积分: 2798
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-08 20:15
文章分类

全部博文(264)

文章存档

2011年(42)

2010年(213)

2009年(4)

2008年(2)

2007年(3)

分类:

2010-12-02 15:56:00

为什么要写这个,因为这篇文章很基础,使用c++或c的人经常会遇到这样的问题。 
和同事分别写不同的模块, 有一天发现有点问题要和同事商量下,修改下接口。 这一修改不打紧, 意味着很有可能会让以前的程序崩溃,而且要是接口被很多调用,嘿嘿。 这是软件工程中的臭味。 

怎么设计接口才能避免这种问题呢? 函数只带固定的几个参数,而且接口变化时,参数个数不能变化,也就是说不能改变函数接口。 有的人可能想到了使用数据结构。 
例如:
typedef struct
{
   int    param1;
   float  param2;
   int    param3;// note: xx年xx月,为了实现xx功能添加了新的参数。
}PARAM_T; 
int A(PARAM_T ¶m);

//! 这是一种方法,我以前也提倡这样用。 添加一个新的参数,只要双方约定好后,添加新的参数,对老的程序不会有影响。 而且扩充了新的功能。 当然最好是把这数据结构定义在一个文件中,要用到该接口的函数都要引用该文件,这样就不会照成, 接口不匹配的问题。 有个问题是这个参数,只能增加,不能减少,原因我想大家都很清楚。


当然数据结构是完全可以胜任,函数参数变化的情况的。 在QT中可以使用 QVariant, 在函数中把QVariant 转换成map 如下:

int A (QVaraint & v)
{
   QMap param = v.toMap(); 
    //好处是可以直接通过名称来检索参数值。而且可以动态添加。
    ... 
}


不用qt的同学就要叫了,我不用qt 有什么好方法么?  那用boost的any.

这篇文章是对我上一篇文章的补充,因为上一遍文章介绍了,通过map的key 来调用成员函数。 要是成员函数的参数不一样,那也达不到通用性。 所以上一遍文章中介绍的方法和本篇文章介绍的方法要结合使用,功力就会大增。

阅读(2726) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~