木老师教笨笨课堂——系列讲座(从函数指针到委托) 一问题的由来
木老师教笨笨课堂——系列讲座(从函数指针到委托)
本文示例在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元
|
.......
|
|
|
如果我想很快到达见我女朋友,我需要选择和谐号,如果我想尽可能的便宜可能会选择票价为94元的快车,如果我想不耽误白天的工作,则我可能选择睡一晚上到达等等。根据具体要求的不同我会选择最佳的车票。这个实际问题如何用程序语言描述呢?
模块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 “想清楚再来买,下一位”;
} |
例1-1
问题似乎得到解决了,可是我的票买好了,而下一位想在北京转车去长春,下下一位需要中午回去给老婆弄饭。于是售票员的Swich....case越来越庞大(难怪售票员阿姨有时候心情不好 也真难为她们了。)于是售票员没有办法了,说:“你们给我一个选择的依据吧”。于是B变成为:
B(Time,StartCity,EndCity,MyBestChoice)
{
// step1找到所有满足条件的票
// step2 bestTicket = MyBestChoice(Ticket[] ticket);
}
|
例1-2
这里的MyBestChoice不再是一个简单的数,更确切地说他是一个行为而不是简单的数据。
吁!为了通俗形象,真是费劲啊。
在C语言里 行为我们往往是用函数表示,而这个行为和一般的行为不同 他是由模块B反过来调用模块A,因此称之为回调(call back)函数。
分类:
Windows图形/程序语言基础
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述