作业3:深入理解Callback函数
一. 代码架构分析
整个lab5.2的代码文件主要分为三部分:主函数调用、接口定义、数据结构定义
- 数据结构定义为
linktableInternal.h
文件,完成了对链表数据结构(包括节点和链表)的定义 - 接口定义包括
linktable.h
与linktable.c
文件,其中头文件只完成了接口的声明,.c
文件完成了具体的接口定义 - 主函数调用文件为
menu.c
文件,其中完成了菜单数据结构的定义、相关方法的编写与main函数
二.调用流程与分层结构
最上层的main()
调用了菜单数据结构的FindCmd()
,而要完成查找节点又必须对链表进行搜索,所以继续往下调用链表数据结构中定义的SearchLinkTableNode()
函数。
- 以上所说的分层处理过程体现了程序的内聚性。
- 在传递过程中,
cmd
将不再作为全局变量而是作为参数进行传递。 - 由于其参数中有一个函数,所以
SearchLinkTableNode()
函数被称为call-in函数,参数函数即是Callback函数。 - 从调用流程与程序的书写位置都可以看出,
main()
与位于Condition()
函数位于同一层,而SearchLinkTableNode()
位于另外一层。
三.Callback函数的解耦作用
Callback回调函数就是一个被作为参数传递的函数。 在本程序中,Callback函数的解耦作用可以体现在两个方面:
- 从参数上说,将
cmd
从全局变量改为作为参数传递,使得两个模块的耦合程度从公共耦合变为标记耦合,降低了耦合性。
公共耦合
当软件模块之间共享数据区或变量名的软件模块之间即是公共耦合,显然两个软件模块之间的接口定义不是通过显式的调用方式,而是隐式的共享了共享了数据区或变量名。
标记耦合
在软件模块之间仅通过显式的调用传递复杂的数据结构(结构化数据)即为标记耦合
- 从程序的分层架构看,Callback函数完成主函数与库函数的分离。在lab5.2中,我们可以根据自己的需要编写函数进行传递,比如对比的数据不是
pNode->cmd
而是其他属性,而这种修改只停留在回调函数层面而不必深入底层进行修改。在实际开发中,主程序与Callback函数在同一层,均由开发人员编写,其代码具体内容根据我们实际情况确定,而库函数要做的就是在需要时调用回调函数即可。
综上所述,Callback函数完成了解耦功能,提高了接口的通用性。
后三位:522