PHP应用程序设计:一个实际的例子(11)

开发者的接口

开发者的接口?这个接口对聊天程序要做什么?又期望它怎样工作呢?典型的,大多数应用程序都苦于不能“固化”。固化的意思是说要么彻底的不能修改,要么不能被陌生的开发者修改。就最终面向用户的软件来说(例如桌面环境,像Wi n d o w s、K D E、M a c O S等等),几乎没有人能够找到理想的解决方案。和聊天系统相似,大多数下载它的人都说:“嗨,真不错,它们又少这又少那。”或者是:“很酷,但是我却不喜欢它们做这做那的方式”。
没有一个容易、清楚的暴露方式提供给使用他们的用户,大多数应用程序最终的结果是成为垃圾。很多人甚至不会使用不是他们自己开发的程序—如果这种简单的做法没有让他们受到沉重的打击的话。
这就意味着要为聊天应用程序一致地强制代码和接口布局的独立性(给H T M L开发者留下一个接口),而且要一致地强制实现数据处理步骤的独立性,我们需要创建一个固化的应用程序核心(应用程序中没有人需要改变的部分),这个核心可作为一套分布式插件的接口(这是应用程序中大多数人都想改变的部分)。
再次思考这些强制的重要性。你愿意一个应用程序像这样被设计出来吗?你需要它吗?思考一下怎样才能认识其重要性。
HTML开发者的接口
就H T M L的接口而言,代码和布局的抽象化是通过使用模板实现的。这是把一个应用程序设计为你需要的最简单的办法,同时它也是最完美的。在几秒钟之内,你可以改变其外观和感觉性能—不用修改一行程序。每一个有基本H T M L知识的人都可以彻底地重新构建一个能够让应用程序把自己显示给用户的方法。因为这种方法在本书的其他地方讨论过,所以我们在这里将不再做深入的讨论。关于使用模板的详细信息,请阅读第5章“基本网络应用策略”。

代码开发者的接口

给其他的开发者提供一个接口通常伴随着A P I(应用程序接口)这个术语。A P I一般是由库提供的(例如p h p I R C),而不是由完整的应用程序提供的。但是具有能被程序员扩展功能的应用程序比只能按它原有状况使用的应用程序要成功得多。当然,就P H P应用程序而言,任何人都可以修改源程序,但是很多人是不会分析一个复杂的系统然后进行所需的修改的。因而,应用程序本身也需要透露某些可以被扩展的方法。
注意我们在这里要区别应用程序和库。库是由应用程序使用的,但不能独立的运行,它一般比应用程序更容易扩展。应用程序由一个完全封闭的系统组成。试着找出通用应用程序如何才能被扩展。例如:对于你偏爱的处理文本的工具来说,你要看一看开发者是否提供了扩展工具功能的能力。

两个主要的扩展应用程序的可能性已经被开发出来:要么应用程序提供脚本程序功能(与宏相似),要么应用程序可以使用插件。对于P H P来说,在部分系统运行的关键时候实现一个脚本语言⋯⋯我们不必更深入的考虑这个问题了。紧接的是,创建一个羽翼丰满的分析程序的方法,其复杂性是难以言尽的。但是用插件实现就容易多了,也有很多优点。一个插件就是一段非常小的代码,它能够把自己注册到应用程序中,然后从中捕捉事件,取得访问内部数据的权限等等。天衣无缝的集成到主系统中时,插件始终保持是分离的文件,它可以单独的分离和传播。它们可以不需修改一行代码就连接到系统当中,这使得一个完全不了解P H P的系统管理员可以使用其他的代码扩展应用程序。通过图3 - 9可以确切的认识这一点。

设计你自己的插件系统,至少在理论上将它构思出来。创建一个小程序,使它能够给自己注册插件,并且能够执行这些插件。
开始的时候,p h p C h a t包括一个包含文件,这个文件依次包含了全部所需的插件。清单显示了这些包含文件是如何工作的:

每一个插件都用同样的方式建立:由主要部分和时间部分组成。主要部分调用p h p C h a t的两个函数,这两个函数的名称如下: c h a t r e g i s t e r p l u g i n i n i t()和c h a t r e g i s t e r p l u g i n d e i n i t()。
每个函数都将另一个函数的名字作为一个参数,这被称为插件程序的初始化和反初始化。p h p C h a t把这些函数名称添加到一个内部列表中。聊天程序初始化的时候,只要p h p C h a t被完全安装好,它就遍历初始化列表,然后自己调用每一个注册插件的初始化函数。相似的,当关机时,它遍历反初始化列表。这个方法允许给插件发送信号,激活和关闭它们。
为了在应用程序中有效, p h p C h a t提供了一套事件,每一个插件可以把自己连接到这些事件中去。在插件初始化过程中,每一个插件都告诉p h p C h a t去发送一套所需的事件。事件可能包括聊天程序是空闲的、用户提交一个新的信息、用户在昵称列表中单击一个昵称名,一个从网络传来的输入信息等等。
运行的时候,插件可以截取这些事件并完成一定的任务。例如:时钟插件把自己注册到“空闲”事件里面,不断检查当前系统的时间。经过预定义的一段时间之后,它把这个当前的系统时间通知给用户。

对大多数用户来说, p h p C h a t也传递参数(例如输入的文本信息),这就允许更改插件。例如:清单3 - 3中的插件清单中包含了以下插件: h t m l s p e c i a l c h a r s和l i n k t r a n s f o r m。这些插件改变信息的输出, h t m l s p e c i a l c h a r s把对h t m l s p e c i a l c h a r s()的调用应用到所有打印的文本(这是出于安全方面的考虑,没有人可以把有害的H T M L代码插入到这个聊天程序中)和侦测所有U R L地址和电子邮件地址的连接转换器中去,并且分别使用<a href = “ ”> < / a >或m a i l t o :预定义它们。于是用户只需要在聊天窗口中单击连接就可以了。

正如你所看到的那样,插件提供了一个非常可靠的扩展复杂系统的方法。因此, p h p C h a t把大多数内部程序都抽象成插件。完整的命令行解释器也成了插件,一整套文本格式和打印处理过程也都使用插件。这就是说只有一个固化的内核不需要修改,因为内核中没有东西需要修改—其余部分都可以自由的修改、扩展、甚至删除,而对系统性能和操作性没有任何影响。你曾见过应用程序不怕它的文件被删除吗?使用这种方法,你就可以做到上点了。
插件的应用很广泛,并不只是用在聊天程序上。例如:你也可以建立一个入口站点,由一般的新闻页、电子邮件接口等组成。你可以设计一个“站点内核”,处理所有的基本问题,例如提供网页布局,数据库终端等等。基于这个站点内核,你可以创建一些插件来显示新闻、发送和收取电子邮件,甚至提供不同的登录方法等等。虽然使用插件可能有点困难,但是我们还是鼓励你能够创建一个使用插件的应用程序作为练习。这是值得一做的。
清单显示的是一个插件模板,实现了“虚拟”的能够插入新插件的代码。主代码为这个插件注册了初始化和反初始化的例行程序。插件的初始化程序随后安装一些插件想截取的回收信号,然后由反初始化程序删除这些回收信号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值