【问题标题】:What is the etymology/meaning of the term "value object"?“价值对象”一词的词源/含义是什么?
【发布时间】:2010-10-13 06:14:56
【问题描述】:

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

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

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

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

【问题讨论】:

标签: java terminology nomenclature value-objects


【解决方案1】:

该术语似乎在不同的上下文中被过度使用。 Misko Hevery describes 我解释的这个词:

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

类似地,Newables 可以在其构造函数中请求其他 Newables,但不能请求 Injectables(有时我将 Newables 称为 Value Object,但同样,这个术语被重载了)。 Newables 的一些示例包括:电子邮件、MailMessage、用户、信用卡、歌曲。如果您保持这种区别,您的代码将易于测试和使用。如果你打破这个规则,你的代码将很难测试。

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

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

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

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

【讨论】:

    【解决方案2】:

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

    值对象

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

    如果有机会,我还建议您亲自聆听 Kevlin 的演讲。我发现他是个非常好的演讲者。

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

    【讨论】:

    • 我不认为值对象总是不可变的。
    • 不要将实现与语义混淆。 Java 的 Calendar 类是可变的——你可以创建一个 2010 年 10 月 13 日的值,然后你可以将它更改为现在是 11 月——语言允许它,但对我来说这是错误的。这就像说我将值 42 更改为 43。
    • Calendar 不是根据 any 定义的值对象 - 它的存在是为了操纵日期,而不是存储它们(这就是 Date 的用途,在这种情况下是可变的明显错误)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    相关资源
    最近更新 更多