数据传输对象与值对象相同还是不同?如果它们不同,那么我们应该在哪里使用DTO,在哪里使用VO?
我们谈论的编程语言是Java,上下文是-有一个web应用程序,它从数据库中获取数据,然后进行处理,最终处理后的信息显示在前端。
值对象是一个简单的对象,其相等性不基于身份。数据传输对象是用于在软件应用程序子系统之间传输数据的对象,通常是在业务层和UI之间。它只关注简单的数据,所以没有任何行为。
数据传输对象是将一堆数据从一个层或层移动到另一个层的拼凑,其目标是通过将一堆东西打包到同一数据结构中并一起发送来最大限度地减少来回调用的次数。有些人也使用它,就像Michael在他的文章中指出的那样,这样一个层使用的类就不会暴露给调用它的层。当我把DTO称为一个拼凑的东西时,我的意思是没有一个精确的抽象概念得到实现,这是一个帮助应用层之间通信的实用解决方案。
Value对象是指我们只对其值感兴趣的对象,如货币金额、日期范围或查找表中的代码。它没有身份,这意味着如果你有几个,你就不会担心跟踪哪个是哪个,因为它们本身不是东西。
将值对象与系统中具有唯一标识的对象(称为实体)进行对比。如果你有一个跟踪客户付款的系统,客户和付款是实体,因为它们代表特定的东西,但付款的金额只是一个价值,就你的系统而言,它本身并不存在。事物与系统的关系决定了它是价值对象还是实体。
如果您不想将实际的域对象发送到服务的客户端,请在服务的边界使用DTO,这有助于减少客户端和服务之间的依赖关系。
values对象只是其相等性不基于身份的对象,例如java.lang.Integer
DTO和值对象实际上并不是彼此的替代品。
它们是不同的,但我过去甚至可以互换使用它们,这是错误的。在《核心J2EE模式》一书的第一版中,我读到DTO(数据传输对象)被称为VO(值对象),但没有找到那个参考文献。
DTO,我有时称之为Dumb Transfer Object,以帮助我记住它是一个容器,不应该有任何业务逻辑,用于在层和层之间传输数据。它应该是一个具有getter/setter属性的对象。
然而,VO类似于JAVA枚举,表示一组固定的数据。VO没有对象标识(内存中对象实例的地址),它由其值标识,并且是不可变的。
Martin Fowler,谈论数据传输对象(DTO):
Sun社区中的许多人使用术语";值对象";对于这种模式。我用它来表示别的意思。
因此术语";值对象";一直被用来指DTO,但就他(和其他海报)而言,它作为DTO的使用似乎不受欢迎。
Matthias Noback文章中给出的很好的详细答案是DTO还是Value Object
简而言之,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
也许是因为缺乏经验,但我会这样说:这是范围的问题。
DTO中有字传输,所以这意味着系统的某些部分将使用它进行通信
值对象的作用域较小,您将把数组中的值对象中的一组数据从一个服务传递到另一个服务。
正如我所理解的,他们中的任何一个都是";其相等性不是基于同一性的对象";。