【问题标题】:Is a Data Transfer Object the same as a Value Object?数据传输对象与值对象相同吗?
【发布时间】:2012-02-08 11:58:09
【问题描述】:

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

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

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

  • 您能否详细说明“谁的平等不是基于身份的”,举个例子?
  • 我可以想象这句话意味着 VO 不必直接映射到域实体,而不是映射到它的某些字段或它的不同“图片”。通常 VO 被理解为与 DTO 相同,但 DTO 更多地基于“字段组合”(来自不同域类的一些字段)。 DTO 示例可以是 CustomerAddress 类和 Customer 类中的字段之间的组合,以将其提供给表示层。
  • @Gaurav 两个值对象在它们具有相同值时相等,但不一定是同一个对象...
【解决方案2】:

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

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

DTO 和值对象并不是真正的替代品。

【讨论】:

    【解决方案3】:

    数据传输对象是将一堆数据从一层或层移动到另一层的组件,其目标是通过将一堆数据打包到同一个数据结构中并发送来最小化来回调用的次数一起。有些人也使用它,比如Michael points out in his post here,这样一层使用的类就不会暴露给调用它的层。当我将 DTO 称为杂物时,我的意思是没有一个精确的抽象概念得到实现,它是一种帮助应用层之间通信的实用解决方法。

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

    将值对象与在您的系统中确实具有唯一标识的事物(称为实体)进行对比。如果您有一个跟踪客户付款的系统,那么客户和付款都是实体,因为它们代表特定的事物,但是付款上的货币金额只是一个值,它本身并不存在,就您的系统而言。某事物与您的系统的关系决定了它是值对象还是实体。

    【讨论】:

      【解决方案4】:

      它们是不同的,但我过去什至将两者互换使用,这是错误的。我读到 DTO(数据传输对象)在核心 J2EE 模式书的第一版中被称为 VO(值对象),但找不到那个参考。

      DTO,我有时将其称为哑传输对象,以帮助我记住它是一个容器,不应该有任何业务逻辑用于在层和层之间传输数据。它应该是一个具有 getter/setter 属性的对象。

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

      【讨论】:

        【解决方案5】:

        Martin Fowler, talking about Data Transfer Objects (DTOs):

        Sun 社区中的许多人使用术语“值对象”来表示这种模式。我用它来表示别的意思。

        所以术语“值对象”被用来表示 DTO,但在他(和其他发帖人)看来,不鼓励将其用作 DTO。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-18
          • 1970-01-01
          • 2013-06-29
          • 1970-01-01
          • 1970-01-01
          • 2012-05-05
          相关资源
          最近更新 更多