0

考虑涉及领域驱动设计 (DDD) 的某些类型的对象:实体、值对象、领域事件和领域服务。

其中哪些被认为是域对象?还有其他的抽象名称来封装其中的一个子集吗?

在谈论 DDD 或域模型时,我可以识别出各种有用的抽象:

  • 实体和值对象。我经常发现自己提到“实体或值对象”。最值得注意的是,这些模型是域状态的模型。相比之下,域服务是无状态的,我认为域事件仅反映有关域如何处于当前状态的信息。

  • 实体、值对象和领域事件。这些可能都包含或表示数据,而域服务仅定义行为。

  • 域模型识别的所有对象。能够谈论一般的领域模型的一部分,而不是它之外的概念,这很有用。

有趣的是,甚至 Stack Overflow 的domain-object标签都有一个令人困惑的定义:

域对象是用于处理模型层的域逻辑的对象。这些对象通常模拟现实生活中的真实(或虚拟)项目:Person、Post、Document 等。

最初的定义侧重于“处理领域逻辑”,倾向于“领域模型识别的所有对象”。然后这些示例倾向于“实体和值对象”。

DDD 强调定义明确、明确的无处不在的语言,这是有充分理由的。不应该以身作则吗?:)

4

1 回答 1

0

其中哪些被认为是域对象?

他们全部。它们是实现我们领域模型的“对象”。在最初的 DDD 文本中,Eric Evans 也使用了“模型元素”这个短语。

它们之间的区别主要是由于 Java 语言的限制。如果您可以创建定制值,则不需要“值对象”;如果您可以传递所需的功能,则不需要“域服务”。如果您将“消息”作为无处不在的构造,则不需要“域事件”,依此类推。

DDD 强调定义明确、明确的无处不在的语言,这是有充分理由的。不应该以身作则吗?:)

好吧,谜团的一部分是这些模式是通用语言的一部分,而 DDD 的核心信息之一是您不应该让通用问题分散您对域本身的注意力。

也就是说......是的 - 如果埃文斯在 18 年前对这些想法有丰富的理解,并且能够引入最好的语言并提供应对措施来防止语义扩散,那就更好了。

于 2020-04-13T16:20:52.410 回答