转换大型不可变消息

时间:2012-07-09 09:28:58

标签: syntax f# functional-programming immutability

来自OOP背景,我在函数式编程中遇到了不可变对象/记录/消息概念的一些问题。

假设我通过一系列函数传递PurchaseOrder记录,其中每个函数都应该添加或更新此记录中的数据。

在处理可变状态时,我只需设置传递消息的一些特定属性。

在处理不可变记录时,是否有一些设计技巧使事情变得更容易? 复制每个字段只是为了改变一个字段只是一种痛苦。

{ A = x.A ; B = x.B ; C = x.C ; D = x.D ; E = somethingnew; }

我认为尽可能分组数据是处理数据的好方法,因此避免复制所有字段。 对此还有其他方法或设计指南吗?

2 个答案:

答案 0 :(得分:9)

你可以做到

 let myRecord3 = { myRecord2 with Y = 100; Z = 2 }

(来自MSDN记录页面的示例 - http://msdn.microsoft.com/en-us/library/dd233184.aspx

答案 1 :(得分:0)

我来自极其纯粹和极端的OOP背景,而我的OOP设计倾向于99%不可变对象(即使在允许变异的语言中)。如果你有一个函数管道,其中每个函数应该在记录中添加或更新数据,根据我的经验,每个函数将处理该记录的子问题和子概念,所以你应该创建一个类/类型/为每个那些遵循OOP最佳做法的人,如SRPSoC。如果任何类/记录/类型具有超过4或5个字段/变量/属性,我认为您可能在那里承担了太多责任。如果将问题拆分为多个子问题,则pipline的每个函数都将创建记录的子记录,而main函数将只将它们组合在一起以创建主记录。根据我的经验,遵循传统的OOP可以让您获得一种设计,让您无需任何突变即可实现您想要的目标。