DDD:不可变的对象也可以是实体吗?


9

我已经阅读了无数关于实体和值对象之间差异的文章,尽管我确实认为至少在概念上我理解两者之间的区别,但似乎在其中一些文章中,作者认为特定领域概念是一个VO,仅仅是因为它是不可变的(因此,其状态将永远不会改变,至少在该特定域模型内)。

您是否同意,如果某个对象的状态在特定的域模型内永远不会改变,那么该对象永远不应是一个实体?为什么?


我必须学习一些DDD,以便可以智能地回答其中的一些问题。我怀疑许多软件开发人员在使用这种简单概念时遇到的困难是由于错误地认为DDD是一种编程方法而引起的。
罗伯特·哈维

Answers:


4

读这本书(Evans,2004年)时,“主要由其身份定义的对象称为实体”。此定义与对象是可变的还是不可变的无关。我认为不可变对象成为给定域中的实体的可能性要小得多,因此,确定对象是“值对象”还是“实体”是一种有用的启发式方法,但这不是定义的一部分。

例如,假设您有一个代表员工的实体,该员工可能有也可能没有直接主管。如果您决定将没有直接主管的想法表示为对“空”主管对象的引用,则“空”主管对象被合理地视为一个实体。您可能会使这个“空”对象不可变。


1
+1管理器在特定上下文或子域中可能是只读的(不可变的),但这并不意味着它没有身份。
Adrian Schneider 2014年

原谅我很笨,但我不完全理解你的主管的例子。您是在说我们将有两个与主管相关的概念吗?一个概念将代表确实有他们要监督的员工的主管(在代码中,此概念将实现为可变的Supervisor类),而另一个概念将描述不监督任何员工的主管(该概念在代码中将实现为null) ?
bckpwrld 2014年

@bckpwrld不,他肯定是指Null Object
maaartinus 2014年

2

我读过的方法是,值对象是一个本身没有标识的对象,并且与状态更改或不更改无关。这使得实体与值对象之间的区别在于实体具有主键,而值对象则没有;它将具有所属实体的外键。

http://lostechies.com/joeocampo/2007/04/23/a-discussion-on-domain-driven-design-value-objects/

我仍然可以更改值对象的属性,但不需要独立于其实体来进行标识。


我从关系数据库(主键)的术语中混合使用身份作为隐喻,请不要从字面上理解它
凯文

至少据我了解,即使在代码中VO都是用可变类型表示的(因此可以修改此类型的实例的属性),从概念上讲,这些VO还是不可变的。因此,更改代表特定VO的实例的属性意味着现在该同一实例代表不同的VO。换句话说,VO在概念上始终是不可变的
bckpwrld
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.