“价值对象”一词的词源/含义是什么?

时间:2010-10-13 06:14:57

标签: java terminology nomenclature value-objects

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

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

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

该术语的词源是什么?它与其他与数据模型相关的术语有何关联?它是来自Java世界并且在某种程度上是在广泛使用吗?

2 个答案:

答案 0 :(得分:2)

该术语似乎在不同的背景下过载。 Misko Hevery describes这个术语正如我所解释的那样:

  

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

     

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

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

  

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

     

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

     

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

答案 1 :(得分:2)

我在2010年的Jazoon,Kevlin Henney就“对象的价值”发表了演讲 - 我强烈推荐watchingreading演示文稿(涵盖价值对象)。有太多的内容让我轻松夏天,但我的解释是:

价值对象

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

如果你有机会,我也建议借此机会亲自听听Kevlin。我发现他是个好演讲者。

您可能还想查看Eric Evan的Domain Driven Design书籍,因为我相信这是Java世界中值对象概念的现代源。