我是一名 .NET / PHP 背景的程序员。
我最近审核了 Flashbuilder 4 / ActionScript 的视频培训。视频培训中的一个视频名为“使用值对象创建数据模型”。我提到“价值对象”对我来说是一个不熟悉的术语,并且不知道他是否用“模型”表示它是否意味着它有点令人困惑我只能将它理解为“模型”,但标题表明我们正在创建一个带有值对象的模型,这表明它们是两个不同的实体。
培训师说,他被告知这是一个在Java中非常常见的术语,有时也被称为“转移对象”。实际上,“值对象”的维基百科页面重定向到“数据传输对象”,而像this one这样的stackoverflow问题提到“值对象”也可能是“ Java中的映射对象“。
该术语的词源是什么?它与其他与数据模型相关的术语有何关联?它是来自Java世界并且在某种程度上是在广泛使用吗?
答案 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)