【关键词】 活与死 回调函数 面向对象设计

  【活与死】

  在面向过程的程序设计里,main函数是活的,函数库等是死的。可以说,所有非main函数的函数,都是直接或间接被main函数调用。

  在MFC程序设计里,所有我们写的处理windows消息的函数,都是MFC这座大楼里(整体框架中)已经设计好的执行单元,我们可以客户化它,但我们不知道这些执行单元什么时候、以及怎样被MFC框架调用——假如我们没有足够理解MFC的话。

  我们可以说,main函数是活的,MFC框架是活的;非main函数、我们自定义的消息处理函数都是死的。

  可以广义化,调用者是活的,被调用者是死的。调用者与被调用者是相对的,同样,活与死也是相对的。

  【什么是回调?】

  假如我们能看到main函数的代码,能够了解到我们的函数是在main函数的哪个时机、地点、怎样被调用的,则我们自己写的非main函数是非回调函数。——我们可以改变调用我们函数的调用者,改变调用我们函数的时机。

  假如我们根本看不到main函数的代码,不能够了解(或者即使我们能看到看懂其源代码,但没有时机去改变main函数的执行序列),则我们自己写的被main函数调用的函数可称之为回调函数。

  对于非回调函数,我们可以自由的改变其形式与结构、改变其含义,如能增加或减少参数、能调整返回值类型——因为我们可以修改调用者(这里广义的称之为main函数)调用它们的方式。

  对于回调函数,我们只能按照别人设计的形式与结构、意图与含义去实现,如不能增加或减少参数、也不能调整返回值类型——因为我们不可以修改调用者,无法改变其形式以及要达成的目标。

Windows中定义的回调函数指的是程序员写的供操作系统调用的函数(windows要求必须是静态函数,函数声明必须有callback字样)。

在c/c++那里,回调指的是,某一个结构体/或类的成员其实是一个函数的指针,这个函数指针成员可以根据编程者的需要指向不同执行实体(真正的被执行单元,但这些被执行单元具有相同的函数声明与结构),用以将调用者与被调用者分离,推迟执行时机——你在A处/时给这个函数指针成员指定具体被执行实体,但事实上,这个被执行实体是在B处/时被真正执行。

在.NET中,有与观察者模式异曲同工的事件委托机制(eventHandler),被观察者有一个eventHandler,在客户端给这个eventHandler添加一些列具有相同结构的函数,然后在通知函数里逐个调用这些eventHandler函数——本质上就是回调。

  【把“活与死”和“回调函数”放到一起来看】

  当被调用者可以要求调用者去适应它(指被调用者)时,被调用者是非回调函数。

  当调用者不可以要求调用者去适应它(指被调用者)时,被调用者是回调函数——调用者说你应该XXX、只能yyy,不允许zzz,被调用者必须一一照办。

  在面向对象程序设计里,典型的,如:

  (1) 在观察者模式里,观察者有一个统一的update函数供被观察者调用。那么,这个update函数就是一个回调函数。

  (2) 在模板方法模式里,模板方法与模板方法所调用的那些虚函数,虚函数就是回调函数。

  推而衍之,我们可以说:

  (1) 实现某个接口的函数,都是回调函数。

  (2) 没有统一规则,可以自由设计与变化的函数,都是非回调函数。

  你有基于接口设计与编程的意识么?你有被回调的意识么?

  【框架与回调】

  所有的框架,其执行机制就是回调。——框架就是一个放大了复杂化了的模板方法模式。

  没有回调存在的框架就是一个函数库。

  框架,让被调用者适应调用者。被调用者根据实际场景,客户化框架中的回调函数(广义的回调函数,如函数、实现类、模块包、客户化组件)。

  函数库,让调用者适应被调用者。

  所有框架,不管是代码框架、应用框架、业务框架,都是被调用者适应调用者。

转载于:https://www.cnblogs.com/gonegone/archive/2011/09/17/2179816.html

活与死、回调以及面向对象设计相关推荐

  1. 深入理解面向对象设计的七大原则

    一.面向对象设计的七大原则是什么? 1.开放封闭原则 2.里氏转换原则 3.依赖倒转原则 4.组合/聚合原则 5.接口隔离原则 6."迪米特"法则 7.单一职责原则 二.七大原则是 ...

  2. Java设计模式(一)面向对象设计原则

    面向对象设计原则 **注意:**推荐完成JavaEE通关路线再开始学习. 我们在进行软件开发时,不仅仅需要将最基本的业务给完成,还要考虑整个项目的可维护性和可复用性,我们开发的项目不单单需要我们自己来 ...

  3. PHP面向对象设计的五大原则

    面向对象设计的五大原则:单一职责原则.接口隔离原则.开放-封闭原则.替换原则.依赖倒置原则.这些原则主要是由Robert C.Martin在<敏捷软件开发--原则.方法.与实践>一书中总结 ...

  4. 【小白学java】java的面向对象设计:封装+继承+抽象类+接口(day06)

    课程链接:共六天 第一天:开发环境:初识java,搭建环境 第二天:语言基础:关键字.变量.常量.运算符 第三天:数据结构:基本类型.包装类型.引用类型(数组和对象) 第四天:流程控制:分支判断.循环 ...

  5. 面向对象设计大作业迭代任务

    第0次任务:面向对象入门 目标: 学会设计简单的类(找出类的属性与方法)任务: 请完成作业03-面向对象入门中的书面作业2.1以面向对象方式改造数据结构作业"有理数"(重点). 上 ...

  6. 面向对象设计思想总结及代码

    一.运行面向对象思想实现 超级简单需求:老张开车去东北 目的:体会面向对象思想 """面向对象设计思想(旧)需求:老张开车去东北变化:增加飞机.汽车....封装:划分类 ...

  7. Java面向对象设计原则1——开闭原则

    在我们学习面向对象编程的时候,总会出现一些问题,好比以前刚刚写好的代码,上线测试可以.正常运行,突然有一天说要加一个功能,改完之后,发现以前正常运行的功能不能用了,类似这样的问题有好多好多,为了避免类 ...

  8. 7.12 其他面向对象设计原则3: 依赖倒置原则DIP

    其他面向对象设计原则3: 依赖倒置原则DIP  The Dependency Inversion Principle 7.1 依赖倒置原则DIP The Dependency Inversion P ...

  9. uml图中的各种箭头_设计模式学习笔记(二):UML与面向对象设计原则

    1 UML 1.1 UML UML(Unified Modeling Language)是统一建模语言,1997年11月UML1.1版本提交给OMG并正式通过,成为建模语言的个那个也标准.2003年6 ...

最新文章

  1. 运用.NET读写Windows注册编辑表
  2. 关于页面打印window.print()的样式问题
  3. 遴选中计算机类,计算机卓越班遴选办法-计算机学院
  4. gpt最大分区容量_[电脑知识]GUID(GPT)磁盘全局唯一分区表详解
  5. 软件工程领域相关的技术标准_女生是否适合学习软件工程专业,以及是否能够有好的就业机会...
  6. mysql指数函数_SQL语言参考大全的目录
  7. 38、JAVA_WEB开发基础之下载功能
  8. hdu 6086 -- Rikka with String(AC自动机 + 状压DP)
  9. error: Microsoft Visual C++ 14.0 is required.
  10. bootstrap table 分页只显示分页不显示总页数等数据
  11. Python统计txt文件中的英文单词个数
  12. Oracle 创建用户为什么要加C##
  13. 全战三国战斗结束卡住_《全面战争:三国》新手指南!全系统解析+上手攻略(上)...
  14. MSYS以及MinGW安装
  15. 我投资理财的“睡后收入”,是普通人10年的工资!
  16. C++程序设计(实践)_老师有话说 S1| 如何学好计算机程序设计(c语言)
  17. Android亮屏和熄屏控制
  18. Android模拟器无法上网问题ZZ
  19. Linux下导入导出 MySQL 数据库表结构数据
  20. 2021-05-26

热门文章

  1. php arff文件,python实现txt文件格式转换为arff格式
  2. 新房装修,家里WiFi怎么弄?
  3. 为什么有人宁愿每年买一部千元机,也不愿一次买部高端机?
  4. NFC是什么功能?有哪些使用场景?
  5. 有哪些相见恨晚的运动常识
  6. 做老板必须要有正气和底气,所谓正气就是身正不怕影子斜
  7. 门槛,才是做生意持久盈利的基础
  8. 初创公司要严控会议时长,日会5-15分钟,周会不超30分钟
  9. 某电子工厂老板感叹创业开厂人生
  10. timeout 和 deadline