一、接口规范
概述:接口及设计目标,目的是避免改动接口,让程序初始化一次,就达到准备工作的状态,其他实现在运行中控制内容。
1、接口,命名要能看出来这个接口的作用。不需要在写fun等标识。
例如;FindKeyWordCount,就不要写成,FindKeyWordCountFun,主意首字母的大小写。
2、接口中的参数如果不确定,具体内存,那就要概述命名,通过传入字符串,在规定字符串中做协议设定。
例如: SetPar(const char *szPar); szPar="LinkNum=3;LogLevel=4";
3、接口中的参数顺序。
1>按照类型
例如:按照类型,int ,int, void * 不要出现int,void *,int
2>按照业务关联
例如: char * szMsg, int nLen, int nMsgFmt,不要出现 int nMsgFmt, char * szMsg, int nLen
3>按照入参出参
例如: int a, char * szbuf,vectorvBlack; 前面2个是入参,后面容器是出参,不要出现int a, vectorvBlack,char * szbuf; 入参和出参混合在一起。
4>接口中参数有默认值。
如果参数中有默认值,将所有默认值的参数放在最后面,而不是随意乱放。
5> 接口参数有结果体
如果参数中有结构体,必须进行初始化,赋值操作,必须字节对齐标志成对出现,结构中有基本类型是可以直接赋值的,但是不提倡直接赋值,我们都要给其提供赋值操作方法。
#pragma pack(1) //1字节对齐 #pragma pack() //取消字节对齐
6> 对接口提供预留参数
本次接口满足本次使用,为了方便后续增加,我们在多预留几个参数做备用。
7>接口的返回值必须要有。
一般是设为int无论在回调函数还是其他函数中,用int的返回值我们对多种错误码,可以做后续处理,特别是回调函数必须要有返回值,返回值的结果有利于下层处理。对于一般函数的返回值我们一般都对上层有力必须保留,如果断网或者其他因素造成问题,上层就会很容易知道并做相关处理。
8>接口中用到回调函数
当接口中有用到回调函数的时候我们就需要将回调函数所属于类的指针或者静态变量等全局性的东西传到其他模块中使用,或者返回到上层细分使用,这个时候就需要一个参数传递这个指针,所以在定义接口的时候我们必需将传递this指针的这个参数。
二、回调函数
概述:回调函数本质中是将数据复制一个备份到其他模块中,目的就是为了方便数据的传递。
1、回调函数的定义:本质上是函数指针的使用,俗称回调函数。
例如:typedef int (* CallBackRecv)( void * p, int a );
2、回调函数中避免是用引用。因为数据存储的位置空间不同。
3、回调函数的实例讲解
模块A中有一个函数实现体但是回调函数在模块A中没有调用。模块A中的回调函数体目的是从模块B中获取数据,获取数据之后是处理完之后将数据转存到其他类中。 模块B中调用模块A的回调函数,目的是将模块B处理的数据装入模块A中,这里我们对于模块A来讲模块B传过来的数据是模块A的入参,而不是出参。模块B的数据存储 在模块B的空间范围的。模块A的函数体在模块A的空间,我们就是利用C++传值调用不改变实参,至改变形参的原理,将模块B的数据拷贝一份到了模块A的空间中。因 为在程序编辑的过程中,每个函数所在的范围都由编辑器决定了,他的生存期与存储区域范围。因为整个承训在代码区中还是要细分为很多个不同控制范围,不同生命 期,不同存储区。
4、回调函数必须是静态的是模块全局唯一的函数,不是临时的函数。
5、回调函数中的参数也可以设置为引用,目的是减少程序中内存的拷贝,可以减少内存消耗,可以提高效率。
转载自新浪博客博主——晴天看雪,博客地址为:http://blog.sina.com.cn/s/blog_9b0604b40102v4lo.html