1.3.2 声明式编程风格

1.3.2 声明式编程风格

用声明式编程风格,我们表达的程序逻辑无需说明执行细节。这个描述听起来有些耳熟,因为它十分类似于我们在 1.1 节中看到的函数式编程的定义。但声明式编程是更为一般的概念,可以使用不同技术来实现;函数式编程只是实现这一目标的一种方法。我们看一个演示,如何用函数语言编写声明性代码。

我们写程序,要以计算机所理解的词汇,向它解释我们的目标,在命令式语言中,这由命令组成。例如,我们可以添加新的命令“显示客户细节”,而告诉计算机应如何完成全部任务的整个程序就是一步一步的描述。比如,程序可以是这样的,“从列表中取下一个客户,如果客户生在活英国,显示其详细信息。如果列表中有其他客户,则转到开始再继续。”

注意

随着程序的增长,我们词汇中的命令数目也越来越多,使词汇难以使用。这时,出现了面向对象的编程,使问题变得简单,因为它能更好地组织命令。我们将涉及客户的所有命令与客户实体(类)相关联,澄清了描述,但程序仍是指定应该如何执行的命令序列。

函数式编程提供了完全不同的方式来扩展词汇量。我们不能能够添加新的基本(primitive)命令,而且能够添加新的基本控制结构,说明如何把命令组织到一起创建程序。在命令式语言中,我们能够把命令组合成序列,或通过使用有限数量的内置构造,如循环,但如果你看看典型的程序,你还会看到很多反复使用的结构(recurring structures),这是组织命令的常用方法。事实上,这些反复使用的结构有些很著名,成为设计模式的一部分。但在命令式语言中,我们仍需要一次次地键入相同结构的代码。

在我们的示例中,可以看到一种模式,表达为“对于第二个命令返回真的所有客户,运行第一个命令。”使用这个基元[ 是哪一个基元,好像没有表达清楚?感觉这一段比较乱,一会儿函数式,一会儿命令式;一会儿声明式,一会儿面向对象。中间好像有遗漏。],表达程序可以简化成,“显示在英国生活的每一位客户的详细信息。”这句话中“在英国生活”是指第二个参数,“显示客户详细信息”是第一个参数。[ 怎么又从命令变成了参数?]

我们来比较一下描述同样问题的两个句子:

■从列表中取下一个客户。如果客户生活在英国,显示其详细信息。如果列表中有其他客户,则转到开始继续。

■显示在英国生活的每一位客户的详细信息。

就像早前关于制作咖啡类比一样,第一句描述究竟如何实现目标,第二句描述想完成什么。

提示

这是命令式和声明式编程风格的本质区别。当然,你也会同意第二句更具可读性,并更好地反映程序的目标。

至止,我们一直在使用类比,但在本章后面,我们会看到如何把思想映射成实际的源代码。函数式编程将使生活更轻松,但并不是唯一的方面。在下一节中,我们将看到另一个概念,它更容易了解程序的运行。

1.3.2 声明式编程风格

时间: 2024-10-08 07:45:32

1.3.2 声明式编程风格的相关文章

有用函数编程

<序> 感谢 关于本书 关于封面 第一部分 学习函数式思维 第一章 不同的思维 1.1 什么是函数式编程? 1.2 通往有用函数编程之路 1.3 用函数式编程提高生产力 1.3.1 函数范式 1.3.2 声明式编程风格 1.3.3 了解程序的执行 1.3.4 设计并发友好的应用程序 1.3.5 函数风格怎样形成代码 1.4 函数式编程演示样例 1.4.1 用声明式风格表达意图 1.4.1.1 用 LINQ 处理数据 1.4.1.2 用 XAML 描写叙述用户界面 1.4.1.3 声明式函数动画

【JavsScript】JavaScript MVC 框架技术选型

你很喜欢Gmail和Trello之类的单页面应用,但是不太确定该从何开始.也许你的JavaScript代码是如此的杂乱无章,以致于你很想在下一个项目上尝试下JavaScript MVC库和框架,却苦于没有头绪?我正在撰写一本单页面应用的书,所以我阅读了大量网上的相关资料.在这里我尝试提供一些看法,希望可以帮助你下决定. 简介 这里讨论的是时下最热的框架,AngularJS.Backbone.Ember和Knockout.同时提到了Batman.CANjs.Meteor和Spine,但是没有详细展

c++11——lambda表达式

lambda表达式 函数式编程的一个语法,有如下优点: (1)声明式编程风格:就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或者函数对象.以更直接的方式写程序,好的可读性和可维护性. (2)简洁:不需要额外再写一个函数或者函数对象,避免了代码膨胀和功能分散. (3)在需要的时间和地点实现功能闭包,使程序更灵活. lambda表达式基本概念和用法 lambda表达式定义了一个匿名函数,并且可以捕获一定范围的变量.lambda表达式的语法如下: [capture] (params) opt

1.4.1.2 用 XAML 描述用户界面

Windows 表现层基础库(WindowsPresentation Foundation,WPF)是用于创建用户界面的 .NET 库,这个库支持声明式编程风格,它将描述用户界面部分与实现命令式程序逻辑的部分分隔开来.使用Windows 表现层基础库的最好办法,是使程序逻辑尽可能小,并尽可能多地以声明式方式创建. 声明式的描述用树状结构表示,其构成的每个对象表示图形用户界面的元素.它可以用 C# 创建,但Windows 表现层基础库还提供更好的方法,使用基于 XML 的语言,称为 XAML.不过

【转载】计算机程序的思维逻辑 (87) - 类加载机制

上节,我们探讨了动态代理,在前几节中,我们多次提到了类加载器ClassLoader,本节就来详细讨论Java中的类加载机制与ClassLoader. 类加载器ClassLoader就是加载其他类的类,它负责将字节码文件加载到内存,创建Class对象.与之前介绍的反射.注解.和动态代理一样,在大部分的应用编程中,我们不太需要自己实现ClassLoader. 不过,理解类加载的机制和过程,有助于我们更好的理解之前介绍的内容,更好的理解Java.在反射一节,我们介绍过Class的静态方法Class.f

计算机程序的思维逻辑 (87) - 类加载机制

上节,我们探讨了动态代理,在前几节中,我们多次提到了类加载器ClassLoader,本节就来详细讨论Java中的类加载机制与ClassLoader. 类加载器ClassLoader就是加载其他类的类,它负责将字节码文件加载到内存,创建Class对象.与之前介绍的反射.注解.和动态代理一样,在大部分的应用编程中,我们不太需要自己实现ClassLoader. 不过,理解类加载的机制和过程,有助于我们更好的理解之前介绍的内容,更好的理解Java.在反射一节,我们介绍过Class的静态方法Class.f

数据库设计(6/9):存储过程主体

对于设计和创建数据库完全是个新手?没关系,Joe Celko, 世界上读者数量最多的SQL作者之一,会告诉你这些基础.和往常一样,即使是最专业的数据库老手,也会给他们带来惊喜.Joe是DMBS杂志是多年来最受 读者喜爱的作者.他在美国.英国,北欧,南美及非洲传授SQL知识.他在ANSI / ISO SQL标准委员会工作了10年,为SQL-89和SQL-92标准做出了杰出贡献. 在上一篇文章里已经介绍了SQL Server里的存储过程标题,Joe会继续谈下存储过程内容的话题.在这篇文章里,他会概况

1.6 小结

这一章简要概述了函数式编程及其意义.我们介绍了声明式编程风格,可用于以函数风格写应用程序和库函数.声明式编程已有许多成功的应用,如 WPF 和 LINQ,而且,在 C# 3.0 中,能够用它来为其他类型的问题写函数式解决方案. 并行编程是现代软件开发展的一大挑战,使用函数方法能使问题显著容易,这要归功于不可变性和声明式编程.不可变性有助于写出正确.安全的代码:声明式编程能够在解决问题时隐藏不必要的技术细节. 在下一章,我们将更全面地了解函数式编程.会从更高的层次上探讨重要的思想,并演示它们的相互

1.4.3.1 并行化不可变程序

首先,让我们再看看清单 1.8,这是两段以函数方式写的游戏代码.在第一段,第二行用到了第一行的结果(运动后怪物的状态).由于使用了不可变类,它没有给我们任何空间引入并行机制. 第二段代码的两行是独立的.我们刚才说过,用函数式编程,独立的程序部分能够并行.现在,我们发现,不可变性对于找出哪些部分程序是独立的,是一个好方法.即使我们不知道任何细节,也可以看出两个操作并行所能带来的变化,对源代码的改变是最小的: var hitMonster = Task.Factory.StartNew(()=> m