数据传输对象和值对象是一样的吗?

22

数据传输对象(Data Transfer Object)和值对象(Value Object)是否相同,还是有所不同?如果它们不同,那么我们应该在哪里使用DTO,在哪里使用VO?

我们讨论的编程语言是Java,上下文是:有一个Web应用程序,从数据库中获取数据,然后对其进行处理,最终将处理后的信息显示在前端。


2
数据传输对象(Data Transfer Object,DTO)是一种在进程之间传递数据的对象,以减少方法调用次数。详见:http://martinfowler.com/eaaCatalog/dataTransferObject.html - Abhijeet
7个回答

16

一个值对象是一个简单的对象,它的相等性不基于标识。 数据传输对象是用于在软件应用程序子系统之间传输数据的对象,通常在业务层和UI之间传输。 它仅专注于纯数据,因此没有任何行为。


3
请您详细说明“不基于身份的相等性”是什么意思,并给出一些例子。 - Gaurav
3
我可以理解这句话的意思是,一个值对象 (VO) 不一定要直接映射到某个领域实体,而是可能映射到它的某些字段或者不同的“形象”。通常情况下,VO 被理解为与数据传输对象 (DTO) 相同,但 DTO 更基于“字段组合”(从不同的领域类中选择一些字段)。比如一个 DTO 的例子可以是由客户地址类和客户类的字段组成,以便服务于表示层。 - frandevel
2
@Gaurav 当两个值对象具有相同的值时,它们是相等的,但不一定是同一个对象... - JuanZe

9
数据传输对象是一种将大量数据从一层或一层传递到另一层的方法,其目标是通过将大量内容打包到同一数据结构中并一起发送来最小化前后调用次数。有些人还使用它,例如Michael在他的帖子中指出的那样,以便一个层使用的类不会暴露给调用它的层。当我把DTO称为技巧时,我的意思是没有一个精确的抽象概念被实现,这是一个实用的解决方案,用于帮助应用程序层之间的通信。
值对象是我们只关心其值的东西,比如货币金额、日期范围或查找表中的代码。它没有身份,这意味着如果你有多个值对象,你不需要关心哪个是哪个,因为它们本身就不是东西。

将值对象与系统中具有唯一标识的事物(称为实体)进行对比。如果您的系统跟踪客户进行付款,那么客户和付款是实体,因为它们代表特定的事物,但付款金额只是一个值,从您的系统角度来看,它本身并不存在。某个东西如何与您的系统相关决定了它是值对象还是实体。


“某物与您的系统的关系决定它是一个值对象还是实体。” -> 话说在联邦银行系统中,钱(一张纸币)可能是一个实体,因为它有其序列号作为身份标识。 - Vladimir Vukanac

6

如果您不想将实际的领域对象发送到服务客户端,则在服务边界处使用DTO可以帮助减少客户端和服务之间的依赖关系。

值对象只是其相等性不基于标识的对象,例如java.lang.Integer。

DTO和值对象并不是彼此的替代品。


3
他们是不同的,但我过去甚至曾交替使用它们,这是错误的。我读到在第一版的Core J2EE Patterns书中,DTO(数据传输对象)被称为VO(值对象),但找不到该参考资料。
DTO有时被称为Dumb Transfer Object,以帮助我记住它是一个容器,不应该有任何业务逻辑,用于在层和层之间传输数据。它只应该是具有属性的对象,具有getter/setter。
VO类似于JAVA Enum,表示一组固定的数据。VO没有对象标识(内存中对象实例的地址),它由其值标识,并且是不可变的。

DTO是否应该进行验证,还是允许将“无效/不支持”的数据传递给服务? - Vladimir Vukanac
那是另一个问题,但我认为简短的答案是否定的。数据的检查应该在数据加载之前或在到达目标地点之后,但在显示数据之前或两者都应该进行。答案取决于数据类型以及您如何验证它。 - James Drinkard

2

Martin Fowler, 谈论数据传输对象(DTO):

太阳社区中的许多人使用“值对象”这个术语来表示此模式。但我使用它来表示其他含义。

因此,“值对象”一词已被用于表示DTO,但根据他(以及其他帖子),似乎不鼓励将其用作DTO。


0

在Matthias Noback的文章它是DTO还是值对象?中有一个很好的详细答案。
简而言之,这是一个DTO:

Declares and enforces a schema for data: names and types
Offers no guarantees about correctness of values

一个值对象:
Wraps one or more values or value objects
Provides evidence of the correctness of these values

0
也许是因为缺乏经验,但我会这样说:这是范围的问题。
DTO 中有单词传输,这意味着系统的某些部分将使用它进行通信。
值对象的范围较小,您将通过值对象传递一组数据,而不是从一个服务传递到另一个服务的数组中。
就我所理解的,它们都不是“其相等性不基于标识的对象”。

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