[转载]木老师教笨笨课堂——系列讲座(从函数指针到委托)一 问题的由来
2009-02-05 11:19
316 查看
木老师教笨笨课堂——系列讲座(从函数指针到委托)
原文地址:http://www.cnblogs.com/helloj2ee/archive/2008/12/02/1345838.html
作者:李响 王双
本文示例在Visual C++ 6.0和 Visual Stdio2005下编译测试通过。
一、问题的由来
程序世界里面经常干的一件事情是模块A给模块B输入若干个参数,然后经过处理再输出一个结果返回给模块A。一般情况下A只需要把应该输入的参数准备好,然后等着模块B完成剩下的工作。可是有些时候B无法完成所有的工作需要获得A的帮助或者在完成工作的过程中他需要告诉A“我完成到什么地步”。这种特殊情况似乎很少见,其实不然。
比如,我去火车站买票,我告诉售票员我需要9月24日郑州到北京的火车票,售票员会告诉我有如下几种车票:
如果我想很快到达见我女朋友,我需要选择和谐号,如果我想尽可能的便宜可能会选择票价为94元的快车,如果我想不耽误白天的工作,则我可能选择睡一晚上到达等等。根据具体要求的不同我会选择最佳的车票。这个实际问题如何用程序语言描述呢?
模块A My 传参数 Time——2007年9月24日 Start City——郑州 End City——北京
模块B Ticket Seller 返回结果:一张合适的郑州到北京的火车票
这里很显然 模块A传给B的参数是不够的,实际情况是售票员会询问:“尊敬的顾客同志,今天从郑州到北京的火车票有和谐号、快车和晚上的K180,请问你要哪一张?”(当然售票员也可能说:“要哪一趟?啊 不知道,查清楚了再过来买,下一位”)。
模块和模块之间的通信确无法做到实际人与人这样的交流。因此A还需要传给B一个如何选择的依据。当然A可以传一个“我要见女朋友”,“我要省钱买房”或者“我要睡一觉”这样的参数。这可以用一个整数来表示,比如1表示“我要见女朋友”,2表示“我要省钱麦房”或者“我要睡一觉”。B在处理过程当中
[align=center]例1-1[/align]
问题似乎得到解决了,可是我的票买好了,而下一位想在北京转车去长春,下下一位需要中午回去给老婆弄饭。于是售票员的Swich....case越来越庞大(难怪售票员阿姨有时候心情不好 也真难为她们了。)于是售票员没有办法了,说:“你们给我一个选择的依据吧”。于是B变成为:
[align=center]例1-2[/align]
这里的MyBestChoice不再是一个简单的数,更确切地说他是一个行为而不是简单的数据。
吁!为了通俗形象,真是费劲啊。
在C语言里 行为我们往往是用函数表示,而这个行为和一般的行为不同 他是由模块B反过来调用模块A,因此称之为回调(call back)函数。
原文地址:http://www.cnblogs.com/helloj2ee/archive/2008/12/02/1345838.html
作者:李响 王双
本文示例在Visual C++ 6.0和 Visual Stdio2005下编译测试通过。
一、问题的由来
程序世界里面经常干的一件事情是模块A给模块B输入若干个参数,然后经过处理再输出一个结果返回给模块A。一般情况下A只需要把应该输入的参数准备好,然后等着模块B完成剩下的工作。可是有些时候B无法完成所有的工作需要获得A的帮助或者在完成工作的过程中他需要告诉A“我完成到什么地步”。这种特殊情况似乎很少见,其实不然。
比如,我去火车站买票,我告诉售票员我需要9月24日郑州到北京的火车票,售票员会告诉我有如下几种车票:
郑州到北京和谐号 | 6:54am——11:58am | 213元 |
郑州到北京的快车 | 7:30am——14:50pm | 94元 |
郑州到北京的K180 | 10:58pm——第二天6:30am | 175元 |
....... |
模块A My 传参数 Time——2007年9月24日 Start City——郑州 End City——北京
模块B Ticket Seller 返回结果:一张合适的郑州到北京的火车票
这里很显然 模块A传给B的参数是不够的,实际情况是售票员会询问:“尊敬的顾客同志,今天从郑州到北京的火车票有和谐号、快车和晚上的K180,请问你要哪一张?”(当然售票员也可能说:“要哪一趟?啊 不知道,查清楚了再过来买,下一位”)。
模块和模块之间的通信确无法做到实际人与人这样的交流。因此A还需要传给B一个如何选择的依据。当然A可以传一个“我要见女朋友”,“我要省钱买房”或者“我要睡一觉”这样的参数。这可以用一个整数来表示,比如1表示“我要见女朋友”,2表示“我要省钱麦房”或者“我要睡一觉”。B在处理过程当中
B(Time,StartCity,EndCity,MyBestChoice) switch(MyBestChoice) { case 1: return “郑州到北京和谐号”; case 2: return “郑州到北京的快车”; case 3: return “郑州到北京的K180”; default: return “想清楚再来买,下一位”; } |
问题似乎得到解决了,可是我的票买好了,而下一位想在北京转车去长春,下下一位需要中午回去给老婆弄饭。于是售票员的Swich....case越来越庞大(难怪售票员阿姨有时候心情不好 也真难为她们了。)于是售票员没有办法了,说:“你们给我一个选择的依据吧”。于是B变成为:
B(Time,StartCity,EndCity,MyBestChoice) { // step1找到所有满足条件的票 // step2 bestTicket = MyBestChoice(Ticket[] ticket); } |
这里的MyBestChoice不再是一个简单的数,更确切地说他是一个行为而不是简单的数据。
吁!为了通俗形象,真是费劲啊。
在C语言里 行为我们往往是用函数表示,而这个行为和一般的行为不同 他是由模块B反过来调用模块A,因此称之为回调(call back)函数。
相关文章推荐
- 木老师教笨笨课堂——系列讲座(从函数指针到委托) 一问题的由来
- 木老师教笨笨课堂——系列讲座(从函数指针到委托) 四、C#的委托
- 木老师教笨笨课堂——系列讲座(从函数指针到委托) 二、C语言里的函数指针
- 木老师教笨笨课堂——系列讲座(从函数指针到委托) 三、C++语言里的函数指针
- C#基础系列问题三委托知识总结1
- 【转载】:【C++跨平台系列】解决STL的max()与numeric_limits::max()和VC6 min/max 宏冲突问题
- <转载>大白话系列之C#委托与事件讲解大结局
- C#基础系列问题三委托知识总结2
- adr和ldr的区别--华清远见嵌入式学院课堂问题笔记系列
- Git 系列之二:Windows 下 Git 客户端的选择,及 msysGit 各种中文问题的解决-转载
- 左神算法课堂系列--数组划分最大绝对值之差问题
- 左神算法课堂系列--纸条折痕问题
- 【转】C#传委托给C的函数指针调用问题
- <转载>大白话系列之C#委托与事件讲解(一)
- 【转载】大型网站架构系列之一,前言,不得不考虑的问题
- 第二十三节: EF性能篇(三)之基于开源组件 Z.EntityFrameWork.Plus.EF6解决EF性能问题 第四节:一些指令总结 定时调度系列之Quartz.Net详解 第十七节:易混淆的概念(静态和非静态、拆箱和装箱) 那些年我们一起追逐的多线程(Thread、ThreadPool、委托异步调用、Task/TaskFactory、Parallerl、async和await)
- C#传委托给C的函数指针调用问题
- 转载和积累系列 - TCP粘包和拆包问题
- Git 系列之二:Windows 下 Git 客户端的选择,及 msysGit 各种中文问题的解决-转载
- Solmyr 的小品文系列之九:次序问题[转载]