数据传输对象是一个用于将一组数据从一个层或多个层移动到另一个层的组合,其目标是通过将一组数据打包到同一个数据结构中并一起发送来最小化来回调用的次数。有些人也使用它,如Michael points out in his post here,这样一个层使用的类就不会暴露给调用它的层。当我将DTO称为组合时,我的意思是,没有一个精确的抽象概念得到实现,它是一个实际的工作区,有助于应用程序层之间的通信。 一个值对象是我们只对它的值感兴趣的东西,比如一个monetary amount,一个日期范围,或者一个lookup table的代码,它没有一个标识,这意味着如果你有几个这样的对象,你不会关心哪个是哪个,因为它们本身不是东西。 将值对象与在系统中具有唯一标识的对象(称为实体)进行对比。如果您有一个跟踪客户付款的系统,则客户和付款都是实体,因为它们代表特定的事物,但付款的货币金额只是一个值,它本身并不存在。就你的系统而言。事物与你的系统的关系决定了它是一个值对象还是一个实体。
6条答案
按热度按时间blmhpbnm1#
值对象是一个简单的对象,其等价性不基于标识。数据传输对象是用于在软件应用程序子系统之间传输数据的对象,通常是在业务层和UI之间。它只关注普通数据,因此没有任何行为。
ncgqoxb02#
数据传输对象是一个用于将一组数据从一个层或多个层移动到另一个层的组合,其目标是通过将一组数据打包到同一个数据结构中并一起发送来最小化来回调用的次数。有些人也使用它,如Michael points out in his post here,这样一个层使用的类就不会暴露给调用它的层。当我将DTO称为组合时,我的意思是,没有一个精确的抽象概念得到实现,它是一个实际的工作区,有助于应用程序层之间的通信。
一个值对象是我们只对它的值感兴趣的东西,比如一个monetary amount,一个日期范围,或者一个lookup table的代码,它没有一个标识,这意味着如果你有几个这样的对象,你不会关心哪个是哪个,因为它们本身不是东西。
将值对象与在系统中具有唯一标识的对象(称为实体)进行对比。如果您有一个跟踪客户付款的系统,则客户和付款都是实体,因为它们代表特定的事物,但付款的货币金额只是一个值,它本身并不存在。就你的系统而言。事物与你的系统的关系决定了它是一个值对象还是一个实体。
a5g8bdjr3#
如果您不想将实际的域对象发送到服务的客户端,请在服务的边界使用DTO-这有助于减少客户端和服务之间的依赖性。
values对象是简单的对象,其相等性不基于标识,例如java.lang.Integer
DTO和值对象实际上不能相互替代。
3ks5zfa04#
它们是不同的,但我甚至在过去互换使用这两个对象,这是错误的。我在第一版的Core J2EE Patterns一书中读到DTO(数据传输对象)被称为VO(值对象),但没有找到该参考。
DTO(我有时称之为Dumb Transfer Object,以帮助我记住它是一个容器,不应该有任何业务逻辑)用于在层与层之间传输数据,它应该是一个具有getter/setter属性的对象。
然而,VO类似于JAVA Enum,表示一组固定的数据。VO没有对象标识(对象示例在内存中的地址),它由它的值标识,并且是不可变的。
xn1cxnb45#
Martin Fowler, talking about Data Transfer Objects (DTOs):
Sun社区中的许多人使用术语"值对象"来表示此模式,我使用它来表示其他含义。
因此,术语"值对象"一直被用来表示DTO,但对于他(和其他海报)来说,它作为DTO的使用似乎不受鼓励。
cwtwac6a6#
在Matthias Noback文章Is it a DTO or a Value Object?中有很好的详细答案
简而言之,DTO:
值对象: