java 数据传输对象是否与值对象相同?

i7uq4tfw  于 2022-12-21  发布在  Java
关注(0)|答案(6)|浏览(133)

数据传输对象和值对象是相同的还是不同的?如果它们不同,那么我们应该在哪里使用DTO,在哪里使用VO?
我们谈论的编程语言是Java,上下文是-有一个Web应用程序,它从数据库中获取数据,然后进行处理,最终处理后的信息显示在前端。

blmhpbnm

blmhpbnm1#

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

ncgqoxb0

ncgqoxb02#

数据传输对象是一个用于将一组数据从一个层或多个层移动到另一个层的组合,其目标是通过将一组数据打包到同一个数据结构中并一起发送来最小化来回调用的次数。有些人也使用它,如Michael points out in his post here,这样一个层使用的类就不会暴露给调用它的层。当我将DTO称为组合时,我的意思是,没有一个精确的抽象概念得到实现,它是一个实际的工作区,有助于应用程序层之间的通信。
一个值对象是我们只对它的值感兴趣的东西,比如一个monetary amount,一个日期范围,或者一个lookup table的代码,它没有一个标识,这意味着如果你有几个这样的对象,你不会关心哪个是哪个,因为它们本身不是东西。
将值对象与在系统中具有唯一标识的对象(称为实体)进行对比。如果您有一个跟踪客户付款的系统,则客户和付款都是实体,因为它们代表特定的事物,但付款的货币金额只是一个值,它本身并不存在。就你的系统而言。事物与你的系统的关系决定了它是一个值对象还是一个实体。

a5g8bdjr

a5g8bdjr3#

如果您不想将实际的域对象发送到服务的客户端,请在服务的边界使用DTO-这有助于减少客户端和服务之间的依赖性。
values对象是简单的对象,其相等性不基于标识,例如java.lang.Integer
DTO和值对象实际上不能相互替代。

3ks5zfa0

3ks5zfa04#

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

xn1cxnb4

xn1cxnb45#

Martin Fowler, talking about Data Transfer Objects (DTOs)
Sun社区中的许多人使用术语"值对象"来表示此模式,我使用它来表示其他含义。
因此,术语"值对象"一直被用来表示DTO,但对于他(和其他海报)来说,它作为DTO的使用似乎不受鼓励。

cwtwac6a

cwtwac6a6#

在Matthias Noback文章Is it a DTO or a 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

相关问题