个 meta 标记。 如果需要设置多个 meta 标 记,则代码必须多次调用 setMeta() 。在这种情况下,更佳的解决
方案是将带有名称-值对的两维数组传 递给 setMeta() ,并且让函数循环执行该数组 — 同时执行所有操作。 一般来说,象这样的同时的函数更可取。用函数需要处理的所有数据一次性调用函数,始终优于多次调用 函数,并以增量的方式为其提供数据。编写函数时的主要思想是,尽量减少从其它代码对其的调用。 据此, setHeader() 解决方案实在不是好方法。显而易见,我们可以将 setHeader() 重构成 setHeader(title, array) ,但是也必须考虑到我们失去了相互独立地设置 title 和 meta 标记的能力。 此外,在实际环境中,标题可能包含多个标记,而不只是 title 和 meta 标记。如果需要添加更多标记, 您必须更改 setHeader() ,并且改变依赖于它的所有其它代码。在后一种情形下,只需多编写一个函数。 下面的等式适用于所有编程语言:
便于记忆的名称 + 清晰的参数 + 速度和效率 = 在所有编程语言中都适用的优质函数
用分层的方法协调函数 函数很少是独自存在的。它们与其它函数共同起作用,交换和处理数据以完成任务。编写可与相同组或模 块中的其它函数良好协作的函数很重要,因为这些函数组或模块组就是您必须能够重用的。 让我们继续假想的页面构建示例。这里,该模块的职责是用
HTML 构建一个页
面。(现在让我们先略过细 节问题和代码,因为示例的目的只是为了说明:在提高可重用性要素的同时,如何使函数和函数组方便地 相互配合。) 从内置的 PHP 函数开始,您可以构建抽象函数,使用它们创建更多处理基本需求的函数,然后依次使用这 些函数构建特定于应用程序的函数。图 2 可以让您了解其工作原理。
图 2. 分层的函数
现在,先在内存中构建页面,然后将完成的页面分发给浏览器。 在内存中构建页面有两大好处:
? ?
可以用自己的脚本高速缓存已完成的页面。 如果未能成功构建页面,可以废弃完成一半的页面,并使浏览器指向出错页面。
现在,您的用户将不会看到页面中有错误消息的
报告了。 根据大多数页面的结构,需要将页面构建模块分成执行以下功能的函数:
? ? ? ?
绘制顶栏 绘制
导航栏 显示内容 添加脚注
还需要执行下述功能的函数:
? ? ?
高速缓存页面 检查页面是否已经被高速缓存 如果页面已被高速缓存则显示它
让我们称之为 页面构建器(pagebuilder)模块。
页面构建器模块通过查询数据库执行其工作。由于该数据库是 PHP 之外的,所以将使用 数据库抽象模块,
其职责是为
PHP 中各种不同的特定于供应商的数据库函数提供同类接口。该模块中的重要函数有:连接数 据库的函数、
查询数据库的函数以及提供查询结果的函数。
假定您还希望实现一个站点范围的搜索引擎。该模块将负责搜索站点上与某个关键字或某组关键字相关的
文档,并根据
搜索字符串的相关性或出现该字符串次数最多来显示结果。如果您还希望记录搜索以便进行 审计,该模块将与 数据库抽象模块一起使用。 请记住,您将接受来自用户的输入。您需要将其显示在屏幕上,并废弃那些看上去怀有恶意的内容。这需 要另一个模块,它负责验证用户通过表单提交的数据。 至此,您对我正在讲述的概念肯定有了大致的了解。必须将最核心的功能分解成逻辑模块,要执行它们的 任务,应用程序必须使用这些模块提供的函数。 使用这种分层的方法,简单的页面构建呈现应用程序可能如图 3 所示。
图 3. 分层的页面构建应用
程序 请注意,在本示例中,核心模块与处理应用程序的模块之间没有层次。也就是说,核心模块可以从下面的 抽象模块或层中声明的函数调用和声明函数,但是应用程序代码可能不能这样做。如果应用程序代码中的 函数受任何低层函数“污染”或者封装了任何低