术语"值对象"的词源/含义是什么?

3

我是一名具有.NET / PHP背景的程序员。

最近我观看了一个关于Flashbuilder 4 / ActionScript的视频培训。其中一个视频的名称为“使用值对象创建数据模型”。我提到“值对象”这个术语对我来说是陌生的,不太确定他是否指的是“模型”,这有点令人困惑,因为我只能将其理解为“模型”,但标题表明我们正在创建一个带有值对象的模型,这表明它们是两个不同的实体。

培训师说他被告知这是Java中的一个相当常见的术语,有时也称为“传输对象”。事实上,“值对象”的维基百科页面会重定向到“数据传输对象”,而像这样的stackoverflow问题则提到“值对象”也可能是Java中的“映射对象”。

这个术语的词源是什么?它与其他数据模型相关的术语有什么关系?它来自Java世界,并且在某个时候已经失去了广泛的使用吗?


可能是DTO、VO、POJO、JavaBeans之间的区别?的重复问题。 - Pascal Thivent
到目前为止,我发现的最早参考资料是在1975年麻省理工学院的一篇关于图像处理的论文中:http://dspace.mit.edu/bitstream/handle/1721.1/41137/AI_WP_110.pdf?sequence=4 根据那篇论文中使用该术语的方式,它必须是已经存在并且在文献中被充分理解的。 - martin clayton
2个回答

2
该术语在不同的上下文中似乎有多重含义。Misko Hevery描述 我理解的术语是这样的:
可注入类可以在其构造函数中请求其他可注入对象。(有时我将可注入对象称为服务对象,但该术语也有多重含义。)[...]以下是一些我希望从我的 DI 框架中获得的类的示例:CreditCardProcessor、MusicPlayer、MailSender、OfflineQueue。
同样,可实例化对象可以在其构造函数中请求其他可实例化对象,但不能请求可注入对象(有时我将可实例化对象称为值对象,但再次,该术语有多重含义)。一些可实例化对象的示例包括:电子邮件、邮件消息、用户、信用卡、歌曲。如果您保持这种区分,您的代码将易于测试和操作。如果您违反此规则,则您的代码将难以测试。
我同意的另一个描述是 http://c2.com/cgi/wiki?ValueObject 中的描述。
价值对象的例子包括数字、日期、货币和字符串等。通常,它们是被广泛使用的小型对象。它们的身份基于它们的状态而不是它们的对象标识。这样,你可以拥有多个相同概念价值对象的副本。
因此,我可以拥有多个代表1998年1月16日的对象的副本。任何一个这些副本都将相互等同。对于这样一个小对象,通常更容易创建新的对象并移动它们,而不是依赖单个对象来表示日期。
在Java中,价值对象应该始终覆盖.equals()方法(或在Smalltalk中覆盖=)。 (记得同时覆盖.hashCode()方法。)

2

我曾在 Jazoon 2010 上听到 Kevlin Henney 的演讲,主题是 "对象的价值" - 我强烈推荐观看视频阅读演示文稿(其中包括价值对象)。由于内容太多,很难简要概述,但我的理解是:

价值对象

表示模型中信息的对象。它没有身份且是不可变的。例如,日期 2010年10月13日可以表示为一个价值对象。它没有身份,而且2010年10月13日永远是2010年10月13日 - 它从不改变。

如果你有机会,我也建议亲自去听一下Kevlin的演讲。我觉得他是个非常优秀的演讲者。

你可能也想查阅 Eric Evan 的领域驱动设计书籍,因为我相信这是Java世界中价值对象概念的现代来源。


我认为值对象并不总是不可变的。 - keuleJ
不要将实现与语义混淆。Java的Calendar类是可变的 - 你可以创建一个值为2010年10月13日的日期,然后你可以将它更改为现在是11月 - 这种语言允许,但对我来说是错误的。这就像说我正在将值42更改为43。 - SteveD
根据任何定义,日历不是值对象 - 它的存在是为了操作日期,而不是存储它们(这就是日期的作用,而在这种情况下,可变性显然是错误的)。 - Michael Borgwardt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接