接口设计漫谈之回调函数1

来源:互联网 发布:恺英网络股票千股千评 编辑:程序博客网 时间:2024/06/06 19:54

回调函数一

         最近看到一个USB设备数据通讯的接口设计,觉得很典型,值得拿出来说一下。

         接口很简单,核心的就是两个函数,如下:

 ------------------------------------------------------------------------------

Int SendCommand(void *pCmd, int nCmdSize);

Int RcvData(unsigned char *pData, int*pnDataSize);

------------------------------------------------------------------------------

 

         发送函数没什么问题,重点是接收的函数。用户调用SendCommand是用户主动的行为,当用户需要USB设备进行某一动作时即调用该函数向设备发送一个命令。

         接收函数RcvData的设计稍微有了点问题,由于USB设备何时向主机发送数据以及数据量的大小是不确定的,因此,用户调用RcvData的结果也是不确定的,有时候 *pnDataSize 0,有时候可能很大,并且,如果用户长时间不调用RcvData的话,可能会产生内部的数据丢失,即接收缓存溢出导致数据的不可控丢失。

 

         从业务逻辑而言,发送的业务逻辑和接收的业务逻辑是不同的:因为用户发送时,他是已经有了所要发送的命令,而他“主动”调用接收函数时,能否接收到数据是不确定的,如果能接收到数据,数据量有多大也是不确定的,造成这种情况的根源在于USB设备何时有数据发到主机是主机无法控制的,在这种情况下,采用回调函数的方式是比较合适的,也更合理。这也是回调函数的一种常见使用方式,类似这种情况还有网络接收函数,常常也采用异步的回调函数方式作为接口。