首页 > 代码库 > 关于本书

关于本书

关于本书

 

如果你已经开发过 .NET 程序,熟悉面向对象技术,想知道“函数式编程”有什么新内容,以及我们如何能从中受益,那么,本书肯定适合你。

本书特别适合已经有面向对象编程和 C# 2.0 知识的开发人员,当然,通常并不要求你有函数编程的知识,更不要求知道 F#。事实上,如果你过去常用面向对象方式思考问题,那么,学习函数式编程会更困难,因为许多函数式思想对你来说是陌生的。我们写这本书已经在思想上有所考虑,通常会注意你的直觉,并比较面向对象与函数式编程,来解释特定的主题。

如果你已经使用过其他面向对象的语言和工具(比如,Java、Python 或 Ruby),有能力快速了解语言的话,也能从本书中受益。我们使用了 C# 的示例,其中的大部分与其他面向对象的语言相似,在其他语言中没有的、C# 3.0 中的新功能只做简单介绍,因此,你也不必担心。

本书并不关注函数式编程的学术方面,但是,如果你是计算机学科的学生,学过这方面的课程,那么,可以通过阅读本书学习有关实用的函数式概念。

 

书中有的:

 

如果你还是想知道本书到底是否适合,那么就看看下面的内容:

函数式编程概念。当你通读全书后,将学会一种全新的思维方式。我们会发现,复杂的、面向对象的设计模式,在函数式编程中会变成一个简单的概念;函数式思维可以用在任何语言的编程中,因此,不管你使用的是哪一种语言,这都是有用的。

实际的基本函数式结构。在 C# 3.0 中有一些结构,因此,你会发现许多熟悉的 C# 代码已经与简洁的函数式 F# 实现非常接近了。我们还将解释 C# 3.0 中的新功能,以及与函数式概念的关系,深入理解这些概念将有助于从新功能中受益。

写实用的 F# 代码。虽然本书并不是有关 F# 的,但还是要教会你入门所需要的一切。我们将介绍 F# 的闪光点,包括异步编程和可组合库。

我们并不指望本书能完美的适合所有目的:计算不是个一刀切的领域。那么,还是应该知道本书中所没有的,以避免失望。

 

书中没有的:

 

本书不是一本参考书,因此,如果你没有接触过函数式编程,那么,最好方法是从头开始,并按章节的顺序阅读本书,因为这是我们假设的阅读方法,后面的章节会引用前面介绍过的概念,而如果你从书的中间开始阅读,会发现难以理解。

本书也不是 F# 编程的简明手册。要想成为一个好的 F# 程序员,唯一的方法是理解函数式编程的思想,你可能学习到所有的 F# 字,并用 F# 重写 C# 代码,但这样做并不好。如果想写出符合习惯的 F# 代码,必须学习不同的思维方法才能进行函数式编程,就也正是你阅读的目的。学会了以函数式风格进行思考以后,可以从其他书籍中更深入地学习F#。

我们写书的主要目的是让专业的程序员解决实际问题的。然而,这并不意谓关我们为你提供一个可以随时使用的解决方案,能够立刻解决你的专门问题;相反,我们更多地关注相关的概念和技术。我们用了许多示例来解释这些原理,但也不可能覆盖到 F# 和函数式编程能应用到的所有领域。

 

路线图

 

本书使用了叠合结构(iterative structure)。在第一部分(第一章到第四章),我们将解释一些最重要的主题,能够了解本书的目的,以及函数编程的差别所在;第二部分(第五章到第八章),系统地讨论所有函数式编程的基础;第三部分(第九章到第十二章),我们将构建这些基础,并讨论函数式编程、优化的最好实践,以及大多数函数式编程员需要经常使用的高级技巧;第四部分(第十三章到第十六章),介绍更复杂的示例,展示如何用函数式编程开发大型的实用项目。

第一章,讨论函数式编程为什么变得越来越重要,给出的示例使用的是你可能已经知道的技术,它得益于函数式编程的某些方面,还展示了第一个用 F# 写的应用程序。

第二章,介绍函数式编程后面的概念,并不展示任何细节,且大部分使用 C#,这将有助于你理解这些概念是如何彼此相关的,以及程序结构的意思。

第三章,最后展示一些实际的函数式代码,演示 F# 中使用的数据类型,比如元级(tuple)和列表(list)。我们将会看到如何在 F# 使用这些类型,还将用 C# 实际这些类型,以解释其原理。这一章会介绍函数就是值的概念,这是函数式编程的核心。

第四章,展示第一个用 F# 实现的实用程序,我们将使用各种 .NET 和 F# 库来实现一个绘制饼图程序;还将看到如何在开发过程中高效地使用 F# 提供的工具。

第五章,讨论值。函数式程序通常写成计算形式,取值作为参数,返回值作为结果,因此,我们必须从系统地了解函数式功能开始,讨论各种类型的值。

第六章,讨论使用值的最常见方法,即使用高阶函数(higher-order function)。直接使用值,通常需要大量重复的代码,因此,这一章将展示如何设计并实现可重用的运算。

第七章,把注意力转向体系方面,函数式程序的结构是由它处理的数据决定的。我们用来演示这个重要原理的是一个操作和绘制简单文档的应用。

第八章,将关注应用程序的体系结构,能够在运行时动态改变其行为,这能够通过使用函数实现,因为,我们会详细讨论,同时将解释相关主题,比如闭包(closure)。

第九章,展示如何在 F# 中面向对象与函数式风格,将演示配合使用函数式功能,比如不可变性,与面向对象的概念,比如封装(encapsulation),写出函数式的 .NET 库。

第十章,将关注正确性与效率。我们将看到如何写出能够处理任意大小的数据集,以及如何写出高效的函数;还将学习如何使用命令式结构,比如数组(array)来优化代码。

第十一章,讨论反射(refactoring)、测试和延迟处理(laziness)。我们将解释函数式编程如何使理解与改进现有代码变得更加容易;还将讨论单元测试,可以看到由于有了可组合性(composability)和严谨性(strictness),有些类型测试可以不必要。

第十二章,首选展示如何处理数据集合,将介绍 F# 的序列表达式(sequence expression),它是专为这个目的的;我们还将看到这不是内置的功能,与 C# 中的最相似的功能不一样,它更常见的是能够改变代码意思的能力。

第十三章,这是一个在 F# 中处理数据的最常见场景。首选使用公开的网站服务(web service)下载数据,然后,解析成结构化的格式,最后,用 Excel 对感兴起的部分进行可视化。

第十四章,展示通过使用函数式概念,能够方便地构建并行化(parallelize)的应用程序,用一个图像处理程序,以及模拟动物和捕食者猎杀动物进行演示,

第十五章,介绍如何构建式函数库(declarative functional library)。设计良好的库能够很优美地组合,比如,创建产生动画的库,和表示金融合约(financial contract)的库。

第十六章,展示如何构建图形界面应用,更一般的,由外部事件驱动的程序。实现像这样的控制流,在其他语言中是相当困难的,因此,我们要看一下 F# 是如何使之更容易的。

 

印刷约定

 

本书中包含了大量的示例代码,使用了定宽字体排版;更长的示例放在有标题的清单中。由于本书混合了 C# 和 F#,在并排的清单中,标题还表示了使用的语言。当展示 F# 代码时,我们区分两种形式的清单,标记为“F#”的代码是真正的源代码,一般来说能够编译;而标记为“F# Interactive”的清单,是在 F# 交互环境中输入的代码段,其输出用斜体排版。加粗的定宽字体用于强调 C# 和 F# 清单中的关键字。

 

命名约定

 

在本书中,我们不仅混合了两种语言,还混合了函数式编程与面向对象两种风格。我们想使用两种语言的自然风格,因此,对于 F# 和 C# 必须遵循不同的约定。

在 C# 中,遵循通常的 .NET 风格;在 F# 中,如果开发的类和组件需要从其他 .NET 语言访问时,毫无例外,也使用这种记号;但是,如果 F# 只是私有的实现,我们就遵循函数式命名风格。最明显的,对变量和函数名,我们都使用了驼峰命名法(camelCase),这在 F# 中是最常用的风格,因为,函数声明与变量声明在本质上是一回事。

偶尔,我们也会使用更短的名字和缩写,这有两个原因:第一,函数式程序员经常使用这种风格。由于在了更好的经常开发环境,几乎再无理由使用这种风格了,因此,我们也尽量少用。但是,有些情况下,短名字在函数式编程已经约定俗成,我们也保留。第二,有时,我们并排两个示例,这样,我们必须尽量用更简单的代码风格;否则,除了文中讨论的少数例外,其他大部分都符合 .NET 风格。

 

StyleCop 和 FxCop

 

如果你熟悉代码分析工具,比如StyleCop 和 FxCop,那么,你可能想知道,本书中的代码是否符合这些工具所要求的规则。我们说大部分符合通常的 .NET 规则,但不是全部,如果你用这些工具运行代码,会有大量的警告,主要有两个原因:

第一,代码分析工具是为面向对象语言开发的,使用的命名与风格都是面向对象的规则。像你将在本书中所学习的,函数式编程在许多方面是不同的,因此,不会简单地遵循所有面向对象的规则。F# 语言之所以成功,是因为它完全不同于 C# 和Visual Basic。它不仅表现看得风的的语言关键字上,而更多的是在编程风格上,在某些方面,命名规则也使代码更简洁。

第二,受本书篇幅的限制。我们使用的源代码示例只演示重要的概念,但对于讨论来说并不重要,它会要求代码遵循规则,我们并不想包括这些杂音。

 

源代码下载

 

本书示例的源代码可以从出版社的网站下载,http://www.manning.com/Real-WorldFunctionalProgramming,也可以从作者的代码库中下载,http://code.msdn.microsoft.com/realworldfp。

 

作者在线

 

购买了《实用函数编程》,可以自由访问由 Manning 出版社经营的私有网站论坛,在这里,你可以评论本书,询问技术问题,得到作者和其他用户的帮助。访问论坛并订阅的地址,http://www.manning.com/Real-WorldFunctionalProgramming,该页面提供了有关注册论坛、获得帮助以及行为规范等信息。

Manning 公司有责任为读者了一个有意义的平台,实现读者之间、读者与作者之间进行交流;但并不承担明确应该是作者的责任,对本书论坛的投稿是自愿的(不付费)。我们建议你询问他们一些有挑战性的问题,以免他们失去兴起。

只要书一出版,作者在线论坛和前面讨论的文档就可以从出版社的网站上访问到。

 

其他在线资源

 

除了Manning 公司的网站(http://www.manning.com/Real-WorldFunctionalProgramming)以外,我们还为本书创建了网站,包含一些很有用的内容,有每一章的源代码,还有一些不适合放在书中的材料。网站上还能链接到有关函数编程的最新文章,因此,可以通过这里学到更多的内容。

如果你对F# 感兴趣,你也可以看看官方的微软开发人员中心(Microsoft’s Developer Center),http://msdn.microsoft.com/fsharp,它包含了最近有关 F# 语言的内容,以及有关文章、视频和其他 F# 资源的链接。如果你想问有关F# 的问题,并保证能得到满意的答案,你可以访问F# 社区论坛,http://cs.hubfs.net。