object - DDD : Classify entity/value object

标签 object dns domain-driven-design entity

我刚开始学习领域驱动设计,最让我困惑的事情之一是如何确定哪个应该是实体,哪个应该是值对象

我知道要确定实体/值对象,我们需要基于领域上下文,在一种情况下,一个领域对象可以是实体,在另一种情况下,它可以是值对象,但仍然有一些情况我不能'决定

.例如地址 - 在客户管理应用程序的上下文中(我们只说一个用于管理客户、添加/删除/更改客户状态等的应用程序),地址显然是值对象,因为在这里我们不需要区分一个地址与另一个地址, 2个客户可以有相同的地址 - 另一方面,在在线预订应用程序的上下文中,我可以说地址是一个实体吗?因为现在我们需要通过账单地址来区分客户(暂时忽略具有相同地址的情况 2 客户)

对我来说,地址本身就是独一无二的,所以它肯定已经具有了身份。那么领域对象的身份并不会决定它是实体对象还是值对象,如果是,那么选择的关键因素是什么?

另一个例子,我有一个应用程序列出了一个国家的多个地区,用户可以选择一个地区,并在该地区找到符合他们搜索条件的所有餐馆。在这种情况下,区域是值对象还是实体?目前我认为它更像是一个实体,但仍然不是很确定。每个区域也是独一无二的

我不确定我的问题是否清楚,我尽量解释一下我目前的想法

最佳答案

我认为您的一些困难可能在于其中一些术语的微妙含义。例如,您提到“对我来说,地址本身就是唯一的,因此它绝对具有身份”。就大多数人如何在域驱动设计中使用“身份”而言,您的陈述可能是不正确的。

值对象的属性集它的定义。如果你改变它的任何方面,你就会有一个完全不同的对象。使用您的地址示例,如果您更改其中的任何部分,您将获得一个完全不同的地址。它是同一个地址,只是在某些方面发生了变化。您的客户搬到了新地址;他们没有更改同一地址的各个方面。

但是,如果您是一个 map 应用程序并且地址本身 发生了变化,那么这里的地址将是一个实体。在这种情况下,城市规划者可能希望对街道上的房屋重新编号。在这种情况下,将修改 SAME 地址。在这种情况下,我们需要更新实体,而不是值对象。

关于您的账单地址示例,账单地址可能仍然是一个值实体(至少是它的物理地址部分)。付款方式(例如信用卡)可能是该示例中的实体,并且它可能包括其他值对象(例如账单地址、信用卡号等)。

您可能会发现查看此问题及其答案很有帮助:Value vs Entity objects (Domain Driven Design)

希望这对您有所帮助。祝你好运!

关于object - DDD : Classify entity/value object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9733490/

相关文章:

concurrency - 拆分聚合根以避免并发冲突

repository - 领域驱动设计 - 存储库和聚合根

javascript - Nodejs 响应的第二级对象出错

c++ - open ofstream 作为类属性

dns - 如何为集群外的查询公开kube-dns服务?

domain-driven-design - DDD : Where to create entity objects?

Java一步传递两个对象

swift - 在 3 秒内调用 spritekit 中的自定义操作大约 100 次

node.js - 主机 header 可以像 Apache 中那样解析为虚拟主机 node.js 吗?

amazon-web-services - 将域分配给 RDS 实例是个坏主意?