工程化编程实战callback接口学习笔记
工程化编程实战callback接口学习笔记
1.实验环境
-
vscode+Remote-ssh插件
使用vscode远程登录Linux虚拟机开发
-
xshell
方便将windows主机中的文件传输到虚拟机中,本次实验室将实验代码传输到虚拟机中
-
Ubuntu虚拟机
2.实验步骤
-
配置Remote-ssh
- 配置远程主机ip和端口号
-
配置公钥登录
具体步骤可以参考此博客
-
安装windows上的ssh服务
设置->应用与功能->管理可选功能,点击添加ssh即可
-
通过Remote-ssh登录到Linux
-
测试代码
-
由于在实际代码的执行过程中会出错,在代码中添加
include "string.h"
-
在终端下使用命令
gcc -o menu linktable.c menu.c
-
运行可执行文件
分别测试help命令和quit命令,发现quit命令报错,结果如下:
-
-
结果分析
检查代码后发现,在主函数中,命令行接受命令后会去调用
FindCmd
函数,根据返回值结果来进行输出:我们继续检查这个
FindCmd
函数,看看其内部到底在干些什么事情.检查代码后发现,FindCmd函数内部只是调用了另外一个函数SearchLinkTableNode
,它啥也没干:于是我们进入到
SearchLinkTableNode
函数内部,看看他的工作有哪些:
这段代码很明显是在遍历一个链表,可以很明显的看到边界代码逻辑中的一个缺陷:并没有遍历链表的最后一个节点.而最后一个节点正好是保存一个退出信息的.在InitMenuData
函数中可以看到整个链表的结构以及每个节点保存的内容:
整个链表就这三个节点,分别对应着help
命令,version
命令以及quit
命令:
分析完成!
接下来我们将代码中的逻辑错误部分进行更正:
tLinkTableNode * SearchLinkTableNode(tLinkTable *pLinkTable, int Conditon(tLinkTableNode * pNode))
{
if(pLinkTable == NULL || Conditon == NULL)
{
return NULL;
}
tLinkTableNode * pNode = pLinkTable->pHead;
while(pNode != NULL)
{
if(Conditon(pNode) == SUCCESS)
{
return pNode;
}
pNode = pNode->pNext;
}
return NULL;
}
重新编译,并执行,结果如下:
大功告成!
3.callback接口的设计方法
- 为什么要使用callback
- 回调函数可以使得接口更加通用,在本节中callback函数使得Linktable查询接口更加通用
- 可以降低软件模块与模块之间的耦合度
- callback函数可以提高用户的实际体验
- 让代码的逻辑更加集中,易读性高
- 如何实现一个接口回调(以java为例)
- 接口类
创建接口,添加接口的实现方法 - 功能类
声明接口对象;设置监听;添加调用接口的方法 - 实现类
创建功能类对象;调动功能类里的实例化接口的方法;调用功能类的调用接口的方法
- 接口类