1.什么是CallBack函数?
回调函数就是一个被作为参数传递的函数。回调函数就是允许用户把需要调用的函数的指针作为参数传递给一个函数。实现回调函数需要两个函数接口,一个是call-in方式函数,它作为回调函数的载体,另一个是函数作为参数,它就是回调函数。
2.menu中的回调函数代码
menu代码结构如下:
其中:
1.linktableInternal.h:LinkTableNode结构体定义了链表节点,LinkTable结构体定义了链表。
2.linktable.h:声明LinkTable操作的接口,声明了链表的创建、删除链表,以及添加、删除、搜索链表节点等函数功能。
3.linktable.c:实现了linktable.h中所定义的链表操作。
4.menu.c:命令行菜单程序,main函数在这里。
3.回调函数示例
1.在linktable.c中的此函数应用了回调函数,其中使用了Condition函数作为SearchLinkTableNode函数的参数,其中传入的Condition函数允许用户自己设计。
tLinkTableNode * GetNextLinkTableNode(tLinkTable *pLinkTable, tLinkTableNode * pNode)
{
if(pLinkTable == NULL || pNode == NULL)
{
return NULL;
}
tLinkTableNode * pTempNode = pLinkTable->pHead;
while(pTempNode != NULL)
{
if(pTempNode == pNode)
{
return pTempNode->pNext;
}
pTempNode = pTempNode->pNext;
}
return NULL;
}
2.在menu中,有如下函数,实现了condition函数。
int SearchCondition(tLinkTableNode * pLinkTableNode, void * args)
{
char * cmd = (char*) args;
tDataNode * pNode = (tDataNode *)pLinkTableNode;
if(strcmp(pNode->cmd, cmd) == 0)
{
return SUCCESS;
}
return FAILURE;
}
4.回调函数应用举例
在sort排序中我们可以通过使用回调函数来自定义排序方式,在官方提供的接口中
sort(v1.begin(),v1.end(),less())是从小到大排序,其中less()即是回调函数。
sort(v1.begin(),v1.end(),greater())是从大到小排序,其中greater()即是回调函数。
5.解耦合方法
1.公共耦合,当软件模块之间共享数据区或变量名的软件模块之间即是公共耦合,显然两个软件模块之间的接口定义不是通过显式的调用方式,而是隐式的共享了共享了数据区或变量名。
2.数据耦合,在软件模块之间仅通过显式的调用传递基本数据类型即为数据耦合。
3.标记耦合,在软件模块之间仅通过显式的调用传递复杂的数据结构(结构化数据)即为标记耦合,这时数据的结构成为调用双方软件模块隐含的规格约定,因此耦合度要比数据耦合高。但相比公共耦合没有经过显式的调用传递数据的方式耦合度要低。
降低耦合度举例,将全局变量改为参数传递的形式,即降低了代码的耦合度。