3

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

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

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

这个术语的词源是什么,它与其他与数据模型相关的术语有什么关系?它是否来自 Java 世界,是否在某个时候不再被广泛使用?

4

2 回答 2

2

我在 Jazoon 2010 上,Kevlin Henney 发表了关于“对象的价值”的演讲 - 我强烈建议观看阅读演示文稿(涵盖价值对象)。内容太多了,我无法轻松总结,但我的解释是:

值对象

表示模型中信息的对象。它没有身份并且是不可变的。例如,日期 2010 年 10 月 13 日可以表示为值对象。它没有身份,2010 年 10 月 13 日始终是 2010 年 10 月 13 日——它永远不会改变。

如果你有机会,我还建议借此机会亲自听凯夫林。我觉得他是一个非常好的演讲者。

您可能还想查看 Eric Evan 的域驱动设计一书,因为我相信这是 Java 世界中值对象概念的现代来源。

于 2010-10-13T07:00:53.253 回答
2

该术语似乎在不同的上下文中被过度使用。Misko Hevery在我解释它时描述了这个术语:

Injectable 类可以在其构造函数中请求其他 Injectable。(有时我将 Injectables 称为服务对象,但该术语已被重载。) [...] 以下是一些我希望从我的 DI 框架中获得的类示例:CreditCardProcessor、MusicPlayer、MailSender、OfflineQueue。

同样,Newables 可以在其构造函数中请求其他 Newables,但不能请求 Injectables(有时我将 Newables 称为Value Object,但同样,该术语被重载)。Newables 的一些示例是:Email、MailMessage、User、CreditCard、Song。如果您保持这种区别,您的代码将易于测试和使用。如果您违反此规则,您的代码将难以测试。

我同意的另一种描述是http://c2.com/cgi/wiki?ValueObject

值对象的例子有数字、日期、货币和字符串。通常,它们是被广泛使用的小物体。他们的身份基于他们的状态而不是他们的对象身份。这样,您可以拥有同一个概念值对象的多个副本。

因此,我可以拥有代表 1998 年 1 月 16 日的对象的多个副本。这些副本中的任何一个都将彼此相等。对于像这样的小对象,通常更容易创建新对象并移动它们,而不是依赖单个对象来表示日期。

值对象应始终覆盖 Java 中的 .equals()(或 Smalltalk 中的 =)。(记住也要覆盖 .hashCode() 。)

于 2010-10-13T06:46:44.160 回答