1.3.2 声明式编程风格
用声明式编程风格,我们表达的程序逻辑无需说明执行细节。这个描述听起来有些耳熟,因为它十分类似于我们在 1.1 节中看到的函数式编程的定义。但声明式编程是更为一般的概念,可以使用不同技术来实现;函数式编程只是实现这一目标的一种方法。我们看一个演示,如何用函数语言编写声明性代码。
我们写程序,要以计算机所理解的词汇,向它解释我们的目标,在命令式语言中,这由命令组成。例如,我们可以添加新的命令“显示客户细节”,而告诉计算机应如何完成全部任务的整个程序就是一步一步的描述。比如,程序可以是这样的,“从列表中取下一个客户,如果客户生在活英国,显示其详细信息。如果列表中有其他客户,则转到开始再继续。”
注意
随着程序的增长,我们词汇中的命令数目也越来越多,使词汇难以使用。这时,出现了面向对象的编程,使问题变得简单,因为它能更好地组织命令。我们将涉及客户的所有命令与客户实体(类)相关联,澄清了描述,但程序仍是指定应该如何执行的命令序列。
函数式编程提供了完全不同的方式来扩展词汇量。我们不能能够添加新的基本(primitive)命令,而且能够添加新的基本控制结构,说明如何把命令组织到一起创建程序。在命令式语言中,我们能够把命令组合成序列,或通过使用有限数量的内置构造,如循环,但如果你看看典型的程序,你还会看到很多反复使用的结构(recurring structures),这是组织命令的常用方法。事实上,这些反复使用的结构有些很著名,成为设计模式的一部分。但在命令式语言中,我们仍需要一次次地键入相同结构的代码。
在我们的示例中,可以看到一种模式,表达为“对于第二个命令返回真的所有客户,运行第一个命令。”使用这个基元[ 是哪一个基元,好像没有表达清楚?感觉这一段比较乱,一会儿函数式,一会儿命令式;一会儿声明式,一会儿面向对象。中间好像有遗漏。],表达程序可以简化成,“显示在英国生活的每一位客户的详细信息。”这句话中“在英国生活”是指第二个参数,“显示客户详细信息”是第一个参数。[ 怎么又从命令变成了参数?]
我们来比较一下描述同样问题的两个句子:
■从列表中取下一个客户。如果客户生活在英国,显示其详细信息。如果列表中有其他客户,则转到开始继续。
■显示在英国生活的每一位客户的详细信息。
就像早前关于制作咖啡类比一样,第一句描述究竟如何实现目标,第二句描述想完成什么。
提示
这是命令式和声明式编程风格的本质区别。当然,你也会同意第二句更具可读性,并更好地反映程序的目标。
至止,我们一直在使用类比,但在本章后面,我们会看到如何把思想映射成实际的源代码。函数式编程将使生活更轻松,但并不是唯一的方面。在下一节中,我们将看到另一个概念,它更容易了解程序的运行。
1.3.2 声明式编程风格