回调函数的基础概念:

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。(百度百科)

在最开始接触到"回调函数"这个概念的时候,自己一直都没能理解"回调函数"的优点。感觉自己写的方法很少用这种概念,可是又不理解为什么php或者js当中,很多内置函数都用了回调的思想。下面将以一个通俗的事例,来为初学者剖析一下"回调函数"的使用场景,如果有写的不正确的地方,还希望大家指正。

在某个公司当中,A是技术总监,手下管理了以群小弟(B、C、D、F....);

突然有一天,公司下达了命令,要做一个商城类系统;这个商城系统的商品主要分为两大体系,虚拟物品与实物物品;

A 总领全局,商城两大体系商品相关的功能拆分给了B(负责虚拟类商品)和C(负责实物类商品)两个助理来负责;

架构体系一:

A负责了支付核心部分的代码架构,封装了一个方法,主要解决所有商品类别的支付订单汇总、调用银行接口转账汇款;

B和C负责各自商品订单的逻辑处理,到支付环节时统一调用A封装的方法(在这个过程当中,可能会涉及到A设计的数据表与B、C数据表中数据相互写入的情况);

思路确定后,大家开始干活儿。

  • 处理方式一:

A告诉大家自己方法返回数据的格式,B和C直接调用A的方法,然后通过A返回的数据,继续操作各自的订单;

coderA:
function A(){//1.处理支付code_pay//2.公用订单code_common_order
}coderB:
function B(){//支付订单A()//支付成功后,虚拟类商品订单的处理code_B
}coderC:
function C(){//支付订单A()//支付成功后,实物类商品订单的处理code_C
}

A看了B、C写的代码过后,建议B、C把支付成功部分的代码也封装起来;

  • 处理方式二:
coderA:
function A(){//1.处理支付code_pay//2.公用订单code_common_order
}coderB:
function B(){//支付订单A()//对虚拟类商品订单处理封装b_order()
}function b_order(){//支付成功后,虚拟类商品订单的处理code_B
}coderC:
function C(){//支付订单A()//对实物类商品订单处理封装c_order()
}function c_order(){//支付成功后,实物类商品订单的处理code_C
}

处理方式二相对于处理方式一而言,代码的模块化程度更高,可读性也会更强。

架构体系一的前提下,我们引入回调的思想。

A告诉B和C,调用他方法的同时,干脆B、C也把处理各自类别订单的方法通过参数的形式传给自己,然后在A写的方法中执行处理不同类别商品订单的数据状态。

  • 处理方式三:
coderA:
function A(Callable $HandleOther){//1.处理支付// code_pay//2.公用订单// code_common_order//3.处理各类订单$HandleOther();
}coderB:
function B(){A( 'b_order');
}function b_order(){//支付成功后,虚拟类商品订单的处理code_B
};coderC:
function C(){A( 'c_order');
}function c_order(){//支付成功后,实物类商品订单的处理code_C
}

第三种方式当中,实际上就是采用了回调的思想。但是基于架构体系一的前提下,笔者认为这种方式与处理方式二的效果是差不多的;并且处理方式三因为采用了回调,在代码的可读性上相对于处理方式二并没有提升,甚至还有下降。

那回调应该用在什么地方比较合适呢?

架构体系二:

A负责了支付核心部分的代码架构,封装了一个方法,这个方法不仅仅要解决所有商品类别的支付订单汇总、调用银行接口转账汇款,而且A还希望在这个方法中,同时就将各类订单支付后需要处理的逻辑给一同处理了;

B和C同样也是主要负责各自商品订单的处理;

基于这种架构,引出以下几种处理方式

  • 处理方式四:
function HandleOne(){//1.处理支付  coderA// code_pay//2.公用订单  coderA// code_common_order//3.如果是虚拟类订单,支付成功后,虚拟类商品订单的处理 coderB// code_B//4.如果是实物类订单,支付成功后,实物类商品订单的处理 coderC// code_C
}

处理方式四,代码耦合高,coder之间层次不明确。

A大佬一使用就觉得不科学,要求B、C分别将自己的代码封装起来,自己主动调用;

  • 处理方式五:
coderA:
function HandleTwo(){//1.处理支付 code_pay//2.公用订单  code_common_order//3.如果是虚拟类订单,支付成功后,虚拟类商品订单的处理CodeB()//4.如果是实物类订单,支付成功后,实物类商品订单的处理CodeC()
}coderB:
function CodeB(){//支付成功后,虚拟类商品订单的处理code_B
}coderC:
function CodeC(){//支付成功后,实物类商品订单的处理code_C
}

处理方式五相对于处理方式四而言,耦合度有所降低,并且各个coder之间的代码可以分层架构,缺陷在于如果每产生一种新的商品类型订单,A都需要来更新自己的代码。

其实到这里大家都应该理解到回调的好处了。

  • 处理方式六:
coderA:
function HandleThree(Callable $HandleOther){//1.处理支付code_pay//2.公用订单code_common_order//3.无论是什么订单,我们都执行 $HandleOther 的这个方法$HandleOther();
}coderB:
function executeB(){//处理一些其他逻辑xxx_code//处理支付逻辑HandleThree('CodeB');
}function CodeB(){//支付成功后,虚拟类商品订单的处理code_B
}coderC:
function executeC(){//处理一些其他逻辑xxx_code//处理支付逻辑HandleThree('CodeC');
}function CodeC(){//支付成功后,实物类商品订单的处理code_C
}

处理方式六就是典型的一种采用了回调来解决问题的思路。降低了耦合提高了层次划分(A写底层函数时,只需要告诉调用者回调函数相关的参数)、各个层次代码之间影响降低(新增多少商品类型订单,A都不需要对自己方法进行改动);

当然,处理方式六所体现出来的好处,主要是基于架构体系二(A不仅仅只希望处理支付相关流程,也希望完成对支付后各类订单状态的同步);如果采用的是架构体系一,回调的意义其实并不大。

其实回调函数本身是一种破坏系统结构的设计,一般而言回调函数都会改变系统的运行轨迹,执行顺序和调用顺序;

但是在某些设计思路作为前提下,采用回调的方式可以大大提高我们代码的可读性以及降低代码耦合度。

笔者写此文的目的就是为了告诉大家,用回调并不意味着一定就是好的。如果各位coder的回调仅仅是让配合开发的工作人员感到晕头转向,那还是采用常规一点的写法来解决问题,不要再折磨大家了。

但是如果有一天,当配合开发的工作人员看到你的回调后,猛拍大腿,wocao~,代码居然还能这样写!给人一种焕然一新、恍然大悟的感觉之时,那就说明各位已经掌握了回调的精髓了。

以上仅仅是笔者对回调的理解,若有错误,欢迎指正。

原创不易,转载请指明出处!

回调函数到底有什么好处相关推荐

  1. 回调函数到底是怎么一回事呢

    今天看到回调函数,有点迷糊,找了好多搜索引擎的资料,都不是让我很能理解,看了<c和指针>我才明白了. 简单描述一下什么是回调函数: 用户把一个函数指针作为参数传递给其他函数,后者将&quo ...

  2. Linux C 函数指针应用---回调函数

    (这里引用了知乎上一些知友的回答,感觉不错,有助于理解,这里引用作为借鉴,如有冒犯,烦请告知) 我们先来回顾一下函数指针,函数指针是专门用来存放函数地址的指针,函数地址是一个函数的入口地址,函数名代表 ...

  3. Linux C 函数指针应用---回调函数

    (这里引用了知乎上一些知友的回答,感觉不错,有助于理解,这里引用作为借鉴,如有冒犯,烦请告知) 我们先来回顾一下函数指针,函数指针是专门用来存放函数地址的指针,函数地址是一个函数的入口地址,函数名代表 ...

  4. 对ajax回调函数的研究

    假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情 ...

  5. 【校招面试 之 C/C++】第15题 C 回调函数

    转自:https://segmentfault.com/a/1190000008293902 做略微改动 什么是回调函数 我们先来看看百度百科是如何定义回调函数的: 回调函数就是一个通过函数指针调用的 ...

  6. 一文搞懂C语言回调函数

    转载自:https://segmentfault.com/a/1190000008293902?utm_source=tag-newest 博主:Rdou Typing 来源:segmentfault ...

  7. 用实际例子理解回调函数(Calback)

    用实际例子理解回调函数(Calback) 在我们编码的过程中,调用和回调几乎无处不在,但是我对回调函数到底是怎样一回事并没有一个真正透彻的理解,最近我查找学习了一些资料,学到了很多. 我参考了一些知乎 ...

  8. 秒懂函数回调机制,回调函数看这篇就够了

    什么是回调函数 友情提示:原理介绍部分摘自:https://www.jianshu.com/p/2f695d6fd64f 有一定基础的直接跳过即可,直接查看后面精彩部分... 回调函数就是一个通过函数 ...

  9. alert 回调_JavaScript中到底什么时候回调函数Callback

    什么是回调函数Callback 简单的理解:回调函数是在另一个函数执行完毕后执行的函数 - 因此名称为'call back'. 复杂的理解:在JavaScript中,函数是对象.因此,函数可以将函数作 ...

最新文章

  1. Java项目:农资采购销售系统(java+SSM+Easyui+maven+Mysql)
  2. 优秀学生是如何高效利用时间的?
  3. android p wifi一直在扫描_在Android上的每次WiFi扫描之间我应该使用什么时间间隔?...
  4. Shell编程:简洁的 Bash Programming 技巧
  5. golang mysql加锁_使用golang实现类InnoDB数据行锁效果
  6. “真还传”即将完结?锤子科技撤回全部破产申请 罗永浩称年后回归科技界
  7. Error running ‘Unnamed‘: Unable to open debugger port (127.0.0.1:xxxx)
  8. python用哪种字体比较好_女生练哪种字体比较好?适合女生写的漂亮字体推荐
  9. 使用MMAction2处理UCF-101数据集
  10. 怎么把电脑上的python软件卸载干净_怎么把一个软件卸载干净 把一个软件卸载干净的两种方法...
  11. TIdTCPClient的几种方法
  12. mysql释放所有_mysql表空间释放情况汇总
  13. Python画五角星(turtle初识)
  14. nokia手机的含义
  15. javase简单入门1
  16. oracle 字段别名
  17. 科学松鼠会--压缩感知
  18. 微信小程序获取用户真实信息
  19. #Paper Reading# Why Should I Trust You? Explaining the Predictions of Any Classifier
  20. 任务4、等差数列求和,判断闰年,判断素数

热门文章

  1. python多路分支_用于多个参数的python multiprocessing pool.map
  2. Python基础学习第三天——条件控制与while循环语句
  3. 赵小楼《天道》《遥远的救世主》深度解析(5)丁元英之所以能成为丁元英的条件的可能之一(一)
  4. 案例C语言在金融工程中应用,成功案例——跨专业申请美国金融工程硕士
  5. 如何从数据库中筛选出达成指定里程碑节点的项目_房地产企业如何搭建运营管理体系...
  6. 沐阳学爬虫11 Requests+PyQuery+PyMongo基本案例实践
  7. 肖像画】别太认真,资金面绝非盘间博弈
  8. uniapp打包h5_全局可视化装修商城上线,可打包APP
  9. Android通讯录模糊匹配搜索实现(号码 首字母 简拼 全拼)
  10. Node.js实现网络新闻爬虫及搜索功能(一)