`
tianshibaijia
  • 浏览: 1126678 次
文章分类
社区版块
存档分类
最新评论

8.3.2 构建组合行为

 
阅读更多

8.3.2 构建组合行为

在清单 8.11 中,验证最低收入和当前工作最小年份的检查和报表函数中,有明显的重复。这些检查有类似的结构:都检查客户的某一属性是否小于最小的允许值。

找出共性是只删除重复第一步。下一步是要看 checkJobYears 和 checkIncome 函数(连同其报表函数)的哪部分是不同的:

■ 检查不同的属性。

■ 使用不同的最小值。

■ 有略微不同的消息。

要更简洁地写出代码,我们可以创建一个函数,取这三个不同的部件作为其参数值,并返回 ClientTest 记录。当我们创建检查列表时,用不同的参数值调用这个新函数两次,创建两个类似的检查。清单 8.13 显示额外的函数(lessThanTest),以及创建检查列表的新方法。

Listing 8.13 Creating similar tests using a single function (F# Interactive)

> let lessThanTest readFunc minValue propertyName =
let report client =
printfn "Checking '%s' of '%s' failed (less than %d)!"
propertyName client.Name minValue
{ Check = (fun client -> readFunc(client) < minValue)
Report = report };;
val lessThanTest : (Client -> int) -> int -> string –> ClientTest

> let tests =
[ (lessThanTest (fun client -> client.Income) 30000 "income")
(lessThanTest (fun client -> client.YearsInJob)
2 "years in the job")
(* more tests... *) ];;
val tests : ClientTest list

像往常一样,这个类型签名告诉我们很多关于这个函数的信息。LessThanTest 函数返回值为 ClientTest,包含了检查和报表函数。检查是用三个参数值生成的:

1 读客端的一个数字属性

2 指定必需的最小值 (在本例中,表示收入或年数)

3 描述属性 (用于报表检查)

这段代码首先声明一个嵌套函数 report,取客户作为参数值,打印检查未通过的原因。这个函数还使用 lessThanTest 函数的参数值,这意味着,当 report 作为结果的一部分返回时,所有这些参数将捕获在一个闭包中。当构建一个将返回的记录值时,我们指定 report 作为这个函数值的一部分,第二部分写成内嵌的,使用 lambda 函数。

使用函数的元组或记录,在函数式编程中很常见,它反映了 F# 的开发风格。但在 C# 中,我们将使用不同的方法来实现这个示例。让我们看一下,在开发过程中,还要考虑如何在 C# 中实现这个示例,并改善当前的 F# 版本。

分享到:
评论

相关推荐

    写给大家看的面向对象编程书(第3版).[美]Matt Weisfeld(带详细书签).pdf

    8.3.2 接口 124 8.3.3 集成 125 8.3.4 编译器的证明 127 8.3.5 建立契约 128 8.3.6 系统插入点 130 8.4 一个电子商务例子 130 8.4.1 电子商务问题 130 8.4.2 非重用的方法 131 8.4.3 一个电子商务解决方案 ...

    [JavaScript.DOM高级程序设计](加)桑贝斯.扫描版.part3.rar

     7.1 组合的技术   7.1.1 语义化XHTML和DOM   7.1.2 JavaScript和XMLHttpRequest对象   7.1.3 XML   7.1.4 一个可重用的对象   7.1.5 Ajax是正确的选择吗   7.2 为什么Ajax会破坏网站及如何解决...

    [JavaScript.DOM高级程序设计](加)桑贝斯.扫描版.part2.rar

     7.1 组合的技术   7.1.1 语义化XHTML和DOM   7.1.2 JavaScript和XMLHttpRequest对象   7.1.3 XML   7.1.4 一个可重用的对象   7.1.5 Ajax是正确的选择吗   7.2 为什么Ajax会破坏网站及如何解决...

    [JavaScript.DOM高级程序设计](加)桑贝斯.扫描版.part1.rar

     7.1 组合的技术   7.1.1 语义化XHTML和DOM   7.1.2 JavaScript和XMLHttpRequest对象   7.1.3 XML   7.1.4 一个可重用的对象   7.1.5 Ajax是正确的选择吗   7.2 为什么Ajax会破坏网站及如何解决...

    javaScript函数式编程

    1.2.4 以函数为行为单位10 1.2.5 数据抽象14 1.2.6 函数式JavaScript初试17 1.2.7 加速19 1.3 Underscore示例22 1.4 总结23 第2章 一等函数与Applicative编程24 2.1 函数是一等公民24 2.2 Applicative编程30 2.2.1 ...

    JavaScript基础教程第8版

    1.10.1 结构、表现和行为 10 1.10.2 div和span 10 1.10.3 class和id 11 1.11 要使用什么工具 12 第2章 开始 13 2.1 将脚本放在哪里 13 2.2 关于函数 14 2.3 使用外部脚本 15 2.4 在脚本中添加注释...

    Excel 2007数据透视表完全剖析 1/7

    2.4 案例学习:依据市场分析行为 25 2.5 与数据源保持一致 29 2.5.1 对现有数据源已经进行修改 29 2.5.2 数据源的范围已经随着行或者列的增加而扩大 29 2.6 共享数据透视表缓存 30 2.7 利用新的数据透视...

    Excel 2007数据透视表完全剖析 5/7

    2.4 案例学习:依据市场分析行为 25 2.5 与数据源保持一致 29 2.5.1 对现有数据源已经进行修改 29 2.5.2 数据源的范围已经随着行或者列的增加而扩大 29 2.6 共享数据透视表缓存 30 2.7 利用新的数据透视...

    Excel 2007数据透视表完全剖析 3/7

    2.4 案例学习:依据市场分析行为 25 2.5 与数据源保持一致 29 2.5.1 对现有数据源已经进行修改 29 2.5.2 数据源的范围已经随着行或者列的增加而扩大 29 2.6 共享数据透视表缓存 30 2.7 利用新的数据透视...

    Excel 2007数据透视表完全剖析 4/7

    2.4 案例学习:依据市场分析行为 25 2.5 与数据源保持一致 29 2.5.1 对现有数据源已经进行修改 29 2.5.2 数据源的范围已经随着行或者列的增加而扩大 29 2.6 共享数据透视表缓存 30 2.7 利用新的数据透视...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part2

    3.5 组合注解与元注解 60 3.5.1 点睛 60 3.5.2 示例 60 3.6 @Enable*注解的工作原理 63 3.6.1 第一类:直接导入配置类 63 3.6.2 第二类:依据条件选择配置类 64 3.6.3 第三类:动态注册Bean 65 3.7 测试 66 3.7.1 点...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part3

    3.5 组合注解与元注解 60 3.5.1 点睛 60 3.5.2 示例 60 3.6 @Enable*注解的工作原理 63 3.6.1 第一类:直接导入配置类 63 3.6.2 第二类:依据条件选择配置类 64 3.6.3 第三类:动态注册Bean 65 3.7 测试 66 3.7.1 点...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part1

    3.5 组合注解与元注解 60 3.5.1 点睛 60 3.5.2 示例 60 3.6 @Enable*注解的工作原理 63 3.6.1 第一类:直接导入配置类 63 3.6.2 第二类:依据条件选择配置类 64 3.6.3 第三类:动态注册Bean 65 3.7 测试 66 3.7.1 点...

    3GPP-23501-g10(中文版).pdf

    4.2.8.3.2 对 TA 48 的要求 4.2.8.4 有线接入网体系结构参考模型 48 4.2.8.5 从不支持 5GC NAS 的设备通过 WLAN 访问 5GC 49 4.2.8.5.1 概述 49 4.2.8.5.2 参考架构 49 4.2.8.5.3 网络功能 50 4.2.8.5.4 参考点 50 ...

    javaSE代码实例

    第2章 基本数据类型——构建Java 大厦的基础 12 2.1 源代码注释 12 2.1.1 单行注释 12 2.1.2 区域注释 12 2.1.3 文档注释 13 2.2 基本数据类型 14 2.2.1 整型 15 2.2.2 浮点型 17 2.2.3 char型 17...

Global site tag (gtag.js) - Google Analytics