帮助思考与限制思维(框架)
帮助思维与限制思维(框架)
If you enjoyed this post, make sure you subscribe to my RSS feed!
帮助思维与限制思维(框架)
If you enjoyed this post, make sure you subscribe to my RSS feed!
本篇文章笔者将继续讨论callback机制的具体应用。通过上一篇的简单阐述,读者可以了解到通过对callback的深入理解和应用,可以使程序框架具有很好的可扩展性,这个意义是普遍的。比如组件的事件模型,ajax的回调,服务器框架回调模型等等。这里只略举几个示例以帮助大家对其具体应用的理解。
服务处理框架:比如我们使用php对外提供服务,且不论apache、lighttpd内部回调设计的精妙,只从php框架角度来看回调的简略应用吧。
框架处理程序:
#callback_func.inc.php
#回调配置文件
final class callback_func
{
static $ARR_PRE_GET_INPUT_CALLBACK = null;
static $ARR_AFTER_GET_INPUT_CALLBACK = null;
static $ARR_PRE_DO_WORK_CALLBACK = null;
static $ARR_AFTER_DO_WORK_CALLBACK = null;
}
#end conf file
#frame.inc.php
function _main()
{
foreach (callback_func::$ARR_PRE_GET_INPUT_CALLBACK as $func_name) {
if (func_exists($func_name)) {
call_user_func($func_name);
//or require_once ($func_name);
}
}
get_input();
foreach (callback_func::$ARR_AFTER_GET_INPUT_CALLBACK as $func_name) {
if (func_exists($func_name)) {
call_user_func($func_name);
//or require_once ($func_name);
}
}
……..
}
_main();
//end of [...]
在前面两篇文章这中,我们讨论了callback机制的特点和本质,通过这些讨论可以使我们对callback有了本质性的认识。在本篇下面的讨论中,笔者将通过前面论述的本质的理解来进行示例性的讨论。
wordpress的应用:大概对于wordpress的爱好者而言,都知道它的可扩展性框架,比如模块的分割、插件的管理等等。其中内部有has_sidebar(), has_posts(), has_plugin()等函数,然后通过while (has_posts: the_posts)来实现了框架本身的可扩展性。我们仔细理解一下的话,这本质就是callback的一个应用。
它通过对一个具体的点的控制,当该点有一个事件的时候,回调用户自已的代码。从这个角脚再来理解wordpress的话,对wordpress设计的理解就会有另一番景象。对于文章的控制,它将用户代码镶嵌在系统框架的内部,使用户可以方便理解在操纵哪一块,样式又是如何对外显示的,层次清晰,模块明朗。
另外wordpress许多插件也亦如此,比如插件的安装和可扩展性等,对于每篇日志的统计和评论等,无不蕴含着这些回调的思想。对于右边的sidebar同样利用了这种思想,比如有了sidebar用户可以添加一些广告,添加分类等,这些都是 wordpress先驱者的精华所在。
因此,如果考虑框架的可扩展性,那么callback思想是你所必须考虑的。
If you enjoyed this post, make sure you subscribe to my RSS feed!
在上一篇文章说明了callback机志的本质,从这个层面上理解,hook和callback一点区别都没有。它描述的是现实世界中一个普遍存在的场景,就是一些事情让别人帮着做的情形。
那么什么时候叫callback,什么时候叫hook更加贴切呢?虽没有明确的区分点,但本人还是简单根据个人的经验说明一下哪种情形用哪个词好吧。
如果在某一件事,到某一阶段的时候,需要帮助我们做一些附加的事的时候,我们最好使用hook命名。
第二:当另一事物有其自身的工作要作,但可以帮助你做一些附加的事的时候,也使用hook命名。
当一个事物单纯为了这种机制而设计的,我们一般使用callback去命名。
实际上,二者没有什么严格的区分点。当然如果你喜欢,统一叫成callback也没什么错误。只不过勾子更偏重于勾子,它局限于callback机制的串接调用;而callback则是整体的实现的一种这样回调的机制。这是一些细节的差异,需要仔细深入的体会。但本质是相同的。
If you enjoyed this post, make sure you subscribe to my RSS feed!
许多接触了一些程序的朋友,可能对这两个词不再默生了,这些朋友可能大概知道callback是什么,也大概知道HOOK可以用来做些什么。但是如果向他们深究一些深层次的东西,却难以得到一个更清晰的答案了。对许多事物的理解我总是认为是这样的,越是了解其本质,答案也就越简单,当然认识也就越深刻,最终不会再拘泥于个别应用上的答案了。为了找到这个答案,让我们逐步进行探索。
callback起初可以形象地这么理解,一个BUTTON存在这里,我们可以add一个action,那么如果这个button被触发的时候会调用这个action。呵呵,这样似乎有点绕了,不过还不难理解。理在再分析一下机制。button像一个事件监听器,也是一个事件源;而action则是一个动作。下面以一些简单的代码加以表示。
class button
{
int width;
int height;
int color;
int style;
Action *paction; //动作列表
….
function event() { //事件触发
….
}
function addAction(Action) {
….
}
}
class Action {
functon actionPerform(Event e) {
….
}
}
到这里这个机制相对就比较明朗了。但是总觉得button描述还不够清晰,因为事件源和监听器还没有分开。button是一个事件源这没有什么异意,但它是监听器有些牵强了。于是下面的代码产生了。
class ActionListener {
Action *paction;//动作列表
functoin action(Event e) {
….
}
}
class button{
ActionListener *pactionlistener;
…..
}
这样无论逻辑上,还是层次上都更加清晰了。好了,通过这个小示例,我们基本上面以了解事件小模型了。对回调也有了感性的认识。
现在让我们做进一步的分晰,抛开button具体,分析其本质。实际做的只是这样一件事:事件源包含有一个或多个事件监听器,一个事件监听器又有一个多个事件(事件就是用户添加的了,想多少就多少:-)。当事件发生的时候,监听器会挨个调用它内部的每个事件。
实际上上述的这些东东就已经触及callback的本质了,但还不明了。那么怎么样可以用更形象的方式去说明这种机制呢?我们做如下试验:
A:我是一个手表修理工,您有什么要做的可以找我。
B:我的手表坏了,你帮我修一下吧,明来我来取。
[...]
,