苹果(值对象)在帝国大厦(实体)
图像生成和人工智能在上面

身份的问题:值对象

一段节选域建模功能,由斯科特Wlaschin

发表在
3分钟阅读 4月24日
https://pragprog.com/newsletter/
https://pragprog.com/newsletter/

我们现在有一个基本的了解如何建模域类型和工作流,所以让我们继续看看分类数据类型的一个重要方法基于他们是否有一个持久的身份。

在DDD术语中,对象持久化身份被称为实体和对象没有一个持续的身份被称为值对象。让我们首先讨论值对象。

在许多情况下,我们正在处理的数据对象没有身份——它们是可以互换的。举个例子,一个实例的WidgetCode价值“W1234”是一样的其他W1234 WidgetCode与价值”。“我们不需要跟踪的是哪一个,他们彼此相等。

在f#我们可能证明如下:

让widgetCode1 = WidgetCode“W1234”
让widgetCode2 = WidgetCode“W1234”
printfn“% b”(widgetCode1 = widgetCode2) / /打印“true”

没有身份的“价值观”的概念经常出现在一个域模型,以及简单类型和复杂类型。例如,PersonalName记录类型可能有两个字段- FirstName和LastName -这是更复杂的比一个简单的字符串;但它也是一个值对象,因为两个人的名字相同的字段是可以互换的。我们可以看到下面的f#代码:

让name1 = {FirstName =“亚历克斯”;LastName = "亚当"}
让name2 = {FirstName =“亚历克斯”;LastName = "亚当"}
printfn“% b”(name1 = name2) / /打印“true”

一种“地址”也是一个值对象。如果两个值相同的街道地址,城市,邮政编码,他们是相同的地址:

让address1 = {StreetAddress =“123主圣”;城市=“纽约”;邮政= " 90001 "}
让address2 = {StreetAddress =“123主圣”;城市=“纽约”;邮政= " 90001 "}
printfn“% b”(address1 = address2) / /打印“true”

你可以告诉这些域中的值对象,因为当讨论它们,你会这样说,“克里斯和我有相同的名字。“这是,即使克里斯和我是不同的人,我们的名字都是相同的。他们没有一个独特的身份。同样,“帕特一样的邮寄地址我”意味着我的地址和帕特的地址有相同的内容,因此平等。

值对象实现平等

当我们使用f#代数模型域类型系统,我们创建的类型将默认实现平等这种实地测试。我们不需要编写任何特殊的平等代码自己,这很好。

更精确地说,两个记录值(相同类型的)都是平等的在f#如果他们所有的字段相等,和两个选择类型是相等的,如果他们有相同的选择情况和数据相关的情况也是平等的。这就是所谓的结构上的平等

我们希望你喜欢这个摘录。你可以继续阅读域建模制作功能在介质betway娱乐官网

或直接购买电子书务实的书架

作为我们的2023年春季销售这本书,你可以节省50%通过使用代码DATAFLOW20232023年4月25日,在午夜等。

印刷复制,访问bookshop.org

书封面与3 d电脑屏幕上的齿轮

- - -

- - -

我们创造及时、实用的书籍和学习资源经典和前沿话题来帮助你练习你的工艺,加快你的事业。

Baidu