8.3.2 构建组合行为

本文探讨了如何在F#中利用函数式编程简化重复代码,通过创建通用函数来处理不同属性的检查任务,从而提高代码的可读性和效率。详细介绍了如何通过参数化函数来创建相似的检查和报告逻辑,以及在C#中实现类似功能的方法。

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# 版本。

v8.3.x通用注册插件下载地址:http://download.csdn.net/source/1141560 修正了window程序编译后还是试用版的问题 最新DevExpress DXperience v2008 vol 3.4 for Visual Studio 2005, 2008和eXpressApp Framework for Visual Studio 2005, 2008注册插件,安装说明: 1. 下载官方试用版安装程序,地址:http://www.devexpress.com/Downloads/NET/ 2. 安装试用版程序 3. 安装本插件程序 注意事项: 1. 本程序不是破解程序,不会修改原版的DXperience和eXpressApp Framework的组件,而是作为Visual Studio 2005和Visual Studio 2008的插件来工作的,因此也只能工作在Visual Studio 2005和Visual Studio2008上,其他开发工具不支持 2. 在安装时,会提示是否编译License文件(默认是选中的),当选中这个选项时,需要在所有Build程序集的机器上安装本插件(例如TFS的Build服务器),这时候编译出来的程序集和使用官方注册版程序的结果相同;如果没有选中这个选项,那么不需要在所有Build程序集的机器上安装本插件,编译出来的程序集和使用官方注册版程序相比,缺少了License资源文件,不过程序运行结果是一样的,不会提示Trial信息 3. 安装程序的Customer Information界面输入的UserName信息,将作为DevExpress的注册信息显示在控件设计器菜单的About对话框里面 4. 如果不想用本插件了,到添加删除程序中卸载DevExpress Registration Add-In即可。 强烈建议,在安装的时候,选中编译License文件选项,并在需要Build程序集的机器上安装本插件程序,这样编译的程序集和使用官方注册版程序的结果是一样的 有关本注册插件程序的更多说明,请见我的博客。 我的博客地址:http://hi.csdn.net/Danny_Su,有任何问题,请留言:) 详情请见:http://blog.csdn.net/Danny_Su/archive/2009/03/14/3991035.aspx Danny Su 2009-3-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值