提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
参考《代码中的软件工程》第六章可复用软件设计及lab5.2的源代码,完成实验并写一篇实验报告,总结Callback函数的工作机制以及通过参数进行解耦合的方法,深入理解接口设计中的抽象分层。
一、回调函数是什么?
把一段可执行的代码像参数传递那样传给其他代码,而这段代码会在某个时刻被调用执行,这就叫做回调。如果代码立即被执行就称为同步回调,如果在之后晚点的某个时间再执行,则称之为异步回调。
二、lab5.2的文件结构
1.数据结构定义为linktableInternal.h文件。
2.接口定义包括linktable.h与linktable.c文件。
3.主函数调用文件为menu.c文件,实现最终功能。
三、通过menu的代码分析
tLinkTableNode * SearchLinkTableNode(tLinkTable *pLinkTable,
int Condition(tLinkTableNode * pNode, void * args),
void * args)
{
if(pLinkTable == NULL || Condition == NULL)
{
return NULL;
}
tLinkTableNode * pNode = pLinkTable->pHead;
while(pNode != NULL)
{
if(Condition(pNode, args) == SUCCESS)
{
return pNode;
}
pNode = pNode->pNext;
}
return NULL;
}
SearchLinkTableNode函数是callin函数,而Condition函数是callin函数的参数,Condition函数就是callback函数。
int InitMenuData(tLinkTable ** ppLinktable)
int SearchCondition(tLinkTableNode *pLinkTableNode, void *args)
{
char * cmd = (char*) args;
tDataNode * pNode = (tDataNode *)pLinkTableNode;
if (strcmp(pNode->cmd, cmd) == 0)
{
return SUCCESS;
}
return FAILURE;
}
/* find a cmd in the linklist and return the datanode pointer */
tDataNode* FindCmd(tLinkTable * head, char * cmd)
{
return (tDataNode *)SearchLinkTableNode(head, SearchCondition, (void *)cmd);
}
SearchCondition函数定义了查询条件。FindCmd函数的目标是找到一个对应的cmd并返回节点指针。
在callin函数和callback函数增加参数args的原因是尽可能追求松散耦合。
综上,Callback函数完成了解耦功能,提高了接口的通用性
四、公共耦合和标记耦合
若一组模块都访问同一个公共数据环境,则它们之间的耦合就称为公共耦合。
如果一组模块通过数据结构本身传递,则称这种耦合为标记耦合。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了callback的使用。
作者:378