数据传输对象是否与Value Object相同?

时间:2012-01-12 06:21:25

标签: java design-patterns web-applications value-objects data-transfer-objects

数据传输对象是否与Value Object相同或者它们不同?如果它们不同,那么我们应该在哪里使用DTO?我们应该在哪里使用VO?

我们谈论的编程语言是Java,上下文是 - 有一个Web应用程序,它从数据库中提取数据然后处理它,最终处理后的信息显示在前端

4 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:2)

如果您不想将实际的域对象发送到服务的客户端,请在服务的边界使用DTO - 这有助于减少客户端和服务之间的依赖关系。

值对象只是对象,其相等性不基于身份,例如java.lang.Integer中

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

答案 2 :(得分:2)

数据传输对象是用于将一堆数据从一个层或层移动到另一个层或层的kludge,目的是通过将一堆内容打包到同一数据结构并发送它来来回减少来回调用的次数一起。有些人也使用它,比如Michael points out in his post here,因此一层使用的类不会暴露给调用它的层。当我将DTO称为kludge时,我的意思是没有一个精确的抽象概念得到实现,它是帮助应用层之间通信的实用解决方法。

值对象是我们只对其价值感兴趣的内容,例如monetary amount,日期范围或lookup table中的代码。它没有一个身份,这意味着你不会担心,如果你有几个,跟踪哪个是哪个,因为它们本身不是东西。

对比值对象在系统中具有唯一标识的对象,称为实体。如果您有一个跟踪客户付款的系统,则客户和付款是实体,因为它们代表特定的东西,但付款的货币金额只是一个价值,它本身并不存在,就你的系统而言。某些内容与您的系统的关系如何确定它是值对象还是实体。

答案 3 :(得分:0)

它们是不同的,但是我过去甚至可以互换使用两者,这是错误的。我读到第一版《核心J2EE模式》一书中的DTO(数据传输对象)被称为VO(值对象),但是找不到该引用。

DTO,有时也称为“哑传输对象”,以帮助我记住它是一个容器,不应使用任何业务逻辑来在层和层之间传输数据。它应该只是一个具有getters / setters属性的对象。

但是,VO类似于JAVA枚举,它表示固定的一组数据。 VO没有对象标识(内存中对象实例的地址),它由其值标识并且是不可变的。