高软作业3:深入理解Callback函数
基于lab5.2的源代码,分析Callback函数的工作机制
首先理解回调函数,回调函数是一个作为参数传递的函数,多使用函数指针实现,通常在发生特定事件和满足特定条件时由另外的软件模块通过函数指针的方式调用,该过程称为对事件或者条件的响应。
在lab5.2中符合该条件的函数模块如下:
tLinkTableNode * SearchLinkTableNode(tLinkTable *pLinkTable, int Conditon(tLinkTableNode * pNode, void * args), void * args)
{if(pLinkTable == NULL || Conditon == NULL){return NULL;}tLinkTableNode * pNode = pLinkTable->pHead;while(pNode != NULL){ //查找符合condition的节点if(Conditon(pNode,args) == SUCCESS){return pNode; }pNode = pNode->pNext;}return NULL;
}
Condition函数作为callback函数允许一定程度的用户自定义,同时callin函数和callback函数中都添加了一个额外参数args,且为void*类型,保证了模块的通用性,将两个模块一定程度上解耦合
在程序中,使用了回调函数机制的函数模块如下
tDataNode* FindCmd(tLinkTable * head, char * cmd)
{return (tDataNode*)SearchLinkTableNode(head,SearchCondition,(void*)cmd);
}
此处SearchCondition作为回调函数接受FindCmd传入进来的参数,该方式通过FindCmd的函数体和SearchLinkTableNode中的额外参数实现,耦合度小于公共耦合。SearchCondition的函数体如下:
int SearchCondition(tLinkTableNode * pLinkTableNode, void * args)
{//查询当前节点是否符合条件char * cmd = (char*) args;tDataNode * pNode = (tDataNode *)pLinkTableNode;if(strcmp(pNode->cmd, cmd) == 0){return SUCCESS; }return FAILURE;
}
另外注意此处的返回值类型为tDataNode*
观察结构体的定义
typedef struct DataNode
{tLinkTableNode head;char* cmd;char* desc;int (*handler)();
} tDataNode;
typedef struct LinkTableNode
{struct LinkTableNode * pNext;
}tLinkTableNode;struct LinkTable
{tLinkTableNode *pHead;tLinkTableNode *pTail;int SumOfNode;pthread_mutex_t mutex;};typedef struct LinkTable tLinkTable;
分析此处模拟了面向对象中继承和多态的机制,进一步隐藏各个模块之间的实现细节,仅暴露接口
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
