设计模式
文章平均质量分 57
心想才事成
这个作者很懒,什么都没留下…
展开
-
7.5.1 用结构模式表示数据
7.5.1 用结构模式表示数据 如果我们讨论程序,是根据数据结构,而不是对象的话,我们可以说,结构模式是描述设计数据结构常见和行之有效的方法。设计模式是更为具体,并指定如何使用面向对象语言的对象来实现这些结构。在本章中,我们会看到,用函数式方法来表示数据。在第一种表示中,我们使用简单的记录列表,用任何一种语言来写都很容易,但是,第二种表示(使用差别联合)更有趣。我们来看一下第一翻译 2011-06-17 14:51:00 · 589 阅读 · 0 评论 -
4.1 用 F# 绘制饼图
4.1 用 F# 绘制饼图 我们将开发一个绘制饼图的应用程序,如图 1 所示。这个应用程序从 CSV 文件(逗号分隔型取值格式,Comma Separated Values)中加载数据,为了计算数据源中的每一项的百分比,需要执行预处理;然后,绘制图表,用户能够以位图格式保存图表文件。我们可以使用库来显示图表(会在第十三章完成),但由我们自己来实现这些功能,能从 F# 代码中学到许多有关 F翻译 2014-09-30 15:30:55 · 712 阅读 · 0 评论 -
5.3.3 添加类型还是函数
5.3.3 添加类型还是函数 正如我们早先提到过的,在 F# 和 C# 中,函数式数据类型 Schedule 在一个方向不可扩展:很难为事件添加新的类型。在 F# 中,困难的原因在于需要修改类型声明,如果类型在共享库中,必须重新编译这个共享库;同样,在 C# 版本中,Tag 属性使得添加新类型更困难。另一方面,这种设计也有好处,能够很容易地添加新的功能处理计划。我们来看一下函数式和面向翻译 2014-10-21 17:12:59 · 695 阅读 · 0 评论 -
2.4.3 模式匹配(Pattern matching)
2.4.3 模式匹配(Pattern matching) 当使用函数数据类型时,我们知道得更多的是有关将要处理的这种类型的结构,这个属性有一很好的示例,就是差别联合。处理此类型时,我们肯定知道能得到什么类型的值(比如,在我们前面的示例中,它可能是矩形、椭圆或组合形状)。要写处理差别联合的函数,必须指定每种情况下程序应该做什么。这种结构可能在很多方面类似于 C# 中的 switch 语句翻译 2014-09-03 20:35:32 · 2968 阅读 · 0 评论 -
7.5.2 使用访问者模式添加函数
7.5.2 使用访问者模式添加函数 在已有的数据结构上添加新的操作,是函数语言中实现处理数据的任何代码的主要方式。在面向对象的语言,很难做到,也很少需要。在这一节,为此目的,我们将讨访问者模式,将草绘如何,使用它在我们的文档表示中添加操作。图 7.8 显示的是我们在这一节要用到的基类。 图 7.8 表示文档的类层次,和泛型访问者类,状态作为泛型类型参数 (T);由于 A翻译 2011-06-17 17:27:00 · 545 阅读 · 0 评论 -
8.2.2 命令设计模式
8.2.2 命令设计模式 命令模式描述了一种在应用程序中表示动作的方法。相对于前一个的模式,它常把已知的行为(比如,列表的筛选)和缺少的部分(谓词)参数化,而命令模式经常存储一些“工作单元”,能够在以后调用。我们经常看到,指定处理或操作步骤的命令集合,用户可以选择。看一下图8.2,你会认识到,一个接口看起来像一个可以用单独函数替换的很好的候选。图8.2 Invoker 存储翻译 2011-06-22 14:36:00 · 624 阅读 · 0 评论 -
7 以数据为中心的程序设计
7 以数据为中心的程序设计 本章介绍■ 表示和处理文档■ 设计不可变数据结构■ 数据表示形式之间的转换■ 使用记录和递归差别联合 在设计函数式程序时,首先考虑程序处理的数据。由于重要的程序都使用数据,因此,在应用程序设计中,这一阶段是极为重要的。在函数语言中,实现程序时,我们也从在代码中会用到的数据结构开始,然后,第二步,写操作处理数据。 这是不同翻译 2011-05-26 11:31:00 · 848 阅读 · 0 评论 -
7.1 函数式数据结构
7.1 函数式数据结构 在函数编程中,程序操作的数据始终存储在数据结构中。数据结构和对象之间的区别是,数据结构公开数据使用的表示形式 (如名字所暗示) 的结构。知道数据的结构便于写代码来处理它,我们会在第 9 章中看到,F# 还我们一种方式来封装结构,就像在面向对象中,当我们想从库中导出 F# 数据结构,或者使其在 C# 中可用。正如我们在第 2 章谈到函数概念时所说的,这些数据结翻译 2011-05-26 14:28:00 · 1000 阅读 · 0 评论 -
7.1.1 使用 F# 记录类型
7.1.1 使用 F# 记录类型 记录是带标记元组(labeled tuples)。它他们将多个不同的元素存储在一个值中;此外,每个元素都有一个可以用来访问它的名字。在 F# 中,元素的名字叫字段(fields)。这在很多方面类似于 C 的记录或结构构造,或者 C# 中的匿名类型。与匿名类型不同,记录必须事先声明。类似于匿名类型,记录,在其基本的形式中,包含唯一属性保存数据;清单翻译 2011-05-27 10:53:00 · 707 阅读 · 0 评论 -
7.1.2 C# 中的函数式数据结构
7.1.2 C# 中的函数式数据结构 我们已经在 C# 中实现了几个函数式的不可变数据类型,比如 FuncList 或元组。在 C# 中,我们会通过写一类特定的方式实现。最重要的是,所有属性必须是不可变的。这可以通过使用只读字段,或者通过声明私有的 setter 属性,只在类的构造函数中设置。在清单 7.3 中,我们使用第一种方法来实现似于类清单 7.1 中的 Rect 类型的类。翻译 2011-05-28 15:32:00 · 685 阅读 · 0 评论 -
7.2 平面文档的表示
7.2 平面文档的表示 在这一章中,我们将要开发一个用于查看文档的应用程序。我们开始设计文档的表示形式,适合于绘制在屏幕上。在这种表示中,文档就是元素的列表,有一些内容(可以是文本,也可以是图像),和指定的边框,其中的内容被绘制。在图7.1中,你可以看到一个文档的示例,有三个突出显示的元素。 让我们看一下在 F# 表示文档的数据结构。清单 7.4 介绍了新的差别联合,表示翻译 2011-05-30 11:28:00 · 519 阅读 · 0 评论 -
7.2.1 制图原理
7.2.1 制图原理 就像在第 4 章中,当我们画饼图时,我们将使用标准 .NET 的 System.Drawin 库。此示例的点是演示使用以前表示,绘图是极其简单,所以,在清单 7.6 的核心函数只有几行代码。它遍历列表中的所有元素,包含绘制的代码在两个不同的元素。 Listing 7.6 Drawing document using flat representatio翻译 2011-06-02 08:59:00 · 1254 阅读 · 0 评论 -
7.3 结构化文档表示
7.3 结构化文档表示 我们将在这一节设计的数据结构从 HTML 格式获得灵感,这是大家熟悉的,并成功创建文档的语言。就像 HTML,我们的表示有几种类型的内容,并且可能以适当的方法嵌套某些部分。图 7.3 显示了带注释的示例文档,它可以给你一个概念,格式包括哪些内容。 有两种不同的部分。简单的部分,如 TextPart 和 ImagePart,包含内容,但是不能包含嵌套翻译 2011-06-06 18:28:00 · 681 阅读 · 0 评论 -
7.3.1 转换表示
7.3.1 转换表示 我们实现数的据类型之间,存在两个关键的区别: 1、在新的表示形式中,文件是单个(递归)值,而在每种情况下,它是元素的列表。 2、第 7.2 节的数据类型显式包含边框,指定内容的位置。 3、第二个数据类型,只表示这部分是如何嵌套的。 这意味着当,当我们转换这种表示形式时,需要计算每个基于嵌套部分的位置。翻译 2011-06-13 14:51:00 · 526 阅读 · 0 评论 -
7.2.2 在窗体上显示绘图
7.2.2 在窗体上显示绘图 绘图类似于第 4 章的示例。因为绘图需要一定的时间,我们将创建内存位图,在那儿绘制文档,然后,在窗体上显示位图,,而不是每次窗体失效时都绘制这个文档。让我们先看一下一个非常有用的函数式编程模式,我们将在这一节中使用。 "中间有洞"模式 写代码时的一个常见情形,是执行一些初始化,然后,是函数的核心部分,最后,是一些清理工作。当你在翻译 2011-06-03 16:54:00 · 637 阅读 · 0 评论 -
7.5 面向对象的表示
7.5 面向对象的表示 标准的设计模式可以分为三组:创建、结构和行为。在这一节中,我们将看几个来自后两组的模式,它们类似于在本章前面使用的 F# 中的结构。模式的函数式版本不同于面向对象,因为,面向对象模式更强调添加新类型,而函数模式更强调添加新的函数,但结构会非常相似。 提示 本节假定你知道一点关于设计模式的内容。你可以在本书的网站上找到介绍性文章的链接,翻译 2011-06-17 09:25:00 · 465 阅读 · 0 评论 -
8.2.1 策略设计模式
8.2.1 策略设计模式 在运行时,如果应用程序需要在几种算法之间,或一种算法的几个部分之间进行选择的话,策略模式是非常有用的。一种常见的情况是,当我们的应用程序需要执行的几个任务,只在较小的子任务上是不同的。使用策略模式,对于任务的公用部分,我们可以只写一次,加上参数化,把子任务(原操作)作为参数值。图 8.1 显示了策略模式的面向对象的表示。 图 8.1 Strat翻译 2011-06-22 09:18:00 · 499 阅读 · 0 评论 -
7.6 第七章小节
7.6 第七章小节 如何以与我们想要使用的数据匹配的方式,处理数据和设计数据结构,是函数式程序设计的一个重要部分。在这一章,通过讨论 F# 记录类型,我们完成了基本的函数式数据类型的工具集。我们使用记录、列表,和递归的差别联合,一起来设计和实现用于处理文档的应用程序。 函数式编程在处理数据过程中,经常使用多种表示方法,我们的应用程序提供了这样一个示例。一种表示形式(元素的翻译 2011-06-19 18:16:00 · 567 阅读 · 0 评论 -
第七章 以数据为中心的程序设计
第七章 以数据为中心的程序设计 本章介绍■ 表示和处理文档■ 设计不可变数据结构■ 数据表示形式之间的转换■ 使用记录和递归差别联合 在设计函数式程序时,首先要考虑的是程序处理的数据;由于重要的程序都使用数据,因此,在应用程序设计中,这个方面极为重要。用函数语言实现程序,我们也是从设计在代码中用到的数据结构开始;下一步才会写处理数据的运算。但是不同于面向对象的设翻译 2014-11-21 11:04:31 · 1553 阅读 · 0 评论