冒号课堂§3.4:事件驱动 - 编程入门网
ing b){ return -a.compareToIgnoreCase(b); }
});
引号很快读懂了代码:“这是将字符串组不区分大小写地逆序排列。其中Comparator的匿名类实现了callback,因为它的方法compare是在类库中被调用的。” “此处callback的好处是显而易见的——它使得Arrays.sort不再局限于自然排序,允许用户自行定制排序规则,大大提高了算法的重用性。”冒号说着将幻灯片又翻到前页,“回头再看win32窗口程序的例子,其中第三步消息循环那段代码不依赖应用程序代码,完全可以提炼出来作为library的一部分。事实上,在Visual C++里这段代码就‘下放’到MFC类库中去了。假设窗口过程由应用程序直接调用,那么消息循环中的代码将不再具有独立性,无法作为公因子分解出来。” 叹号块垒顿消,畅然无比:“终于搞清那个怪异的窗口过程了!每个窗口在创建时就携带了一个callback,以后每当系统侦查到事件,都能轻易地从事发窗口身上找到它的callback,然后调用它以响应事件。” “这等于将侦查事件与响应事件两项任务进行了正交分解,降低了软件的耦合度和复杂度。”句号言犹未尽,又加了一句,“就像刚才,引号负责侦查事件——警戒,逗号负责响应事件——警醒。想法很好,可惜配合不够默契,还是给人逮住了。” 逗、引二人大窘,余者大笑。 “仔细比较,以上两个callback的用法还是稍有不同的。在字符串组排序中,callback在作为参数传入底层的函数后,很快就在该函数体中被调用;在窗口程序中,callback则先被储存起来,至于何时被调用完全是未定之数。用一句话概括:前者属同步(synchronous)回调,后者属异步(asynchronous)回调。它们都使调用者不再依赖被调者,将二者从代码上解耦,异步调用更将二者从时间上解耦。”冒号显示出一副新图—— “图中处于底层的软件平台是在win32 API的基础上的改进。不仅把主循环从应用程序中沉淀下来,而且将储存callback的过程封装在一个注册函数中,使得应用程序代码变得更简洁、健壮。同时我们看到,整个流程的控制权已经从应用程序的主程序转移到底层平台的主循环中,符合好莱坞原则。”冒号。 冒号课堂§3.4:事件驱动(5)时间:2011-06-25 BlogJava xyz98逗号好奇地问:“什么是好莱坞原则?” “don''t call us, we''ll call you.”冒号难得甩出一句洋文,“我很想画蛇添足地在末尾加上单词‘back’,这样更容易理解callback的含义:‘call you back’。此话的背景大约是这样的:一个艺人要想演出,需与好莱坞的经纪公司联系。由于幻想一朝成名的人太多,经纪人总是牛气十足,他们的口头禅是:‘别打电话给我们,留下你的电话,有活干我们会打给你的’。” 引号认真地解析:“好莱坞经纪公司相当于一个背后运作的软件平台,艺人相当于一个callback,‘留下你的电话’就是注册callback,‘我们会打给你的’就是异步调用callback。” 冒号接着补充:“‘别打电话给我们’意味着经纪公司处于主导地位,艺人们处于受控状态,这便是控制反转(Inversion of Control,简称IoC)。” 问号听着耳熟:“控制反转?第一课谈到框架时似乎提到过。” “没错,正是它!”冒号谈兴愈浓,“一般library中用到callback只是局部的控制反转,而framework将IoC机制用到全局。程序员牺牲了对应用程序流程的主导权,换来的是更简洁的代码和更高的生产效率。如果将编程譬比命题作文,不用framework的程序是一张可 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |