第X课【回调函数相关】回调 解耦 事件驱动 同步回调 异步回调

系统编程和应用编程

系统编程

通过灵活使用底层软硬件,编写库文件,提供API给上层应用

应用编程

通过调用库文件的API,不用过多顾虑底层软硬件,编写程序,以完成任务

回调函数

回调函数就是通过函数指针去调用的函数

回调函数的特别之处

其实回调函数中的函数就是我们常规定义的函数,只是它的调用方式不同

  1. 常规调用:通过函数名,并且根据情况填入适当的输入参数
    e.g int Max(int a, int b);
  2. 回调:通过函数指针将回调函数当作另一个函数(库)的输入参数,由另一个函数(库)来通过函数指针来调用回调函数
    e.g 定义函数int Max(int a, int b),讲函数Max指针传入函数Comparer(result, Max),通过Comparer去调用Max

回调的图解
在这里插入图片描述

回调的形式

同步回调

当main函数调用Caller函数后,等待Caller函数执行完成后,再继续执行。这种回调是阻塞式的

异步回调

当main函数调用Caller函数后,不用等待Caller函数执行完成,直接继续执行,Caller函数执行完成后根据回调函数自行去执行相应功能。这种回调是非阻塞式的

异步回调的优点

  1. 异步回调不引起阻塞,效率更高
    e.g 某个函数如果它的执行需要依赖用户的输入。如果使用同步回调来调用这个函数,那么主函数只有在用户进行相应后才会继续执行;如果使用异步回调,那么主函数调用完该函数后直接继续执行,无需去等待用户的输入,当用户进行输入时,再根据传入的回调函数去执行相应的操作即可
  2. 异步回调可以将某些任务(函数执行,计算)分配给其他硬件资源去执行,从而更高效地去运用资源

回调的使用

回调的优势

  1. 解耦
    降低耦合度是回调的一大用法
    耦合度,是一个比较抽象的概念,指的是事物之间的紧密关系。可以这么理解:
    • 一个函数(代码模块)如果只能完成某一项功能,那么它和调用它的函数(代码)的耦合度就相对较高
    • 一个函数(代码模块)如果能完成某一类功能,那么它和调用它的函数(代码)的耦合度就相对较低

      e.g 场景一:如果你经常需要使用冒泡排序算法去对不同数据类型的数组进行排序

不用回调,你所需要编写的函数
intSort();
charSort();
floatSort();
doubleSort();
需要排序时,对于不同数据类型要去调用对应数据类型冒泡排序函数,传入数组参数即可。这样的函数和调用函数的耦合度就很高,每种函数只能完成特定数据的排序

使用回调后,你所需要编写的函数
Max();
Sort( Max )
需要排序时,调用通用冒泡排序函数Sort( Max )即可,无需关心数据是什么类型,只需要向Sort函数里传入判断数组元素大小的Max函数即可。这样的函数与调用它的函数耦合度就很低,一个函数能实现好几种数据的比较排序

  1. 事件驱动
    事件驱动Event-Driven指的程序的执行依赖于事件的发生
    e.g 场景二:以你的键盘程序为例,当你按下一个按键时,使用程序执行的流程是这样的
    在这里插入图片描述

不使用回调,实现流程是这样的
int main()
{
KeyListen();
KeySend();
}
对于main函数来说,就是我调用监听程序,我监听键盘,等待按键按下,我调用命令发送程序发送指令
main函数就只能按部就班的等待监听结果,然后发送命令。而不能去执行其他的任务(一旦main去执行其他任务,就不能确保KeyListen和KeySend函数的执行顺序)

使用回调以后,实现流程是这样的
int main()
{
KeyListen(KeySend);
}
对于main函数来说,就是我调用监听函数,监听函数去监听键盘,监听函数去等待键盘按下,监听键盘去调用命令发送函数发送指令
main 函数可以在调用按键监听函数后再去执行其他的任务,其他的交给按键监听函数执行

避免掉入回调地狱中

回调地狱是回调的一种误用。这种误用由于过多滥用回调而产生,会使代码中加入很多嵌套的,从而大大降低代码的可读性和可维护性

e.g同样以键盘程序为例
频繁的使用回调,让程序流程变成这样
int main()
{
Keylisten(KeySend(LastSendOver));
}
KeySend()
{
LastSendOver(CkeckRegister);
}
一个Caller函数回调Callback函数,Callback函数同时又是Caller函数,再去调用另一个Callback函数,循环多次后,代码就会形成回调地狱

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值