一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天。
1.概述
接触业务代码工程多了,就会发现不同的工程中都有着很多相同或不同的各种 xxO。为什么需要这么多不同类型的 xxO。分别为了解决什么问题呢?本文将会尝试着探讨一下。
首先看引用一张图,这张图代表了网上比较一致的意见,较好的表达了每种 xxO 的使用场景。
2.VO
2.1 VO(View Object)-- 显示层对象
图中的 VO 是 View Object,表示显示层对象。显示层对象,通常是 Web 向模板渲染引擎层传输的对象(摘自《阿里巴巴 Java 开发手册1.4.0》)。
2.2 VO(Value Object)--值对象
还有一种 VO 是值对象。网上很多讨论这个主题的文章把用于显示层的VO 写成了Value Object,这时不对的,大家要注意。值对象在图中没有表示,这里稍微提一下。值对象是领域驱动设计 DDD 中的概念,是领域模型中的领域层元素。值对象用来表示领域中一类有意义的值,这类值不需要标识 ID,它们有意义的是值本身。 值相同的值对象就是相同的。比如面向对象书籍中常见的包含 red、green 和 blue三个属性的 Color 类,就是一种值对象,如果两个Color 对象,三个属性分别相等,那么我们就任何这两个 Color 对象是相同的。值对象通常会用作领域中实体的属性。
2.DTO
DTO(Data Transfer Object)是数据传输对象,主要用来在不同的应用层之间传输数据。 可以把 DTO 当作是没有逻辑的数据容器。DTO 这个概念最初是由Martin Fowler 在他的《企业应用架构模式》一书中定义的。
那么显示层对象(VO)和 DTO 有什么区别呢?大多数情况没有区别,都是用于传输数据的载体。但是可能存在某些场景要求显示层有特殊的要求。比如某些属性在显示层不展示、数据中用 0/1 表示的性别,在显示层需要“女/男”。由于接口一旦发布,为了保证兼容接口的客户端,就比较难以更改。出于对接口稳定性考虑,在显示层使用区别于 DTO 的显示层对象(VO),尽管大多数时候它们没有区别。
3.DO
DO(Data Object)数据对象与数据库表结构一一对应,通过 DAO 层向上传输数据源对象(摘自《阿里巴巴 Java 开发手册1.4.0》)。实际DO 可以用领域驱动设计中的领域层元素Entity 代替。Entity 不仅能包含于数据库对应的属性,还有丰富的业务逻辑。
4.DAO
DAO(Data Access Object)是一个数据访问接口,所谓数据访问,顾名思义,就是与数据库打交道,夹在业务逻辑与数据库资源中间。我们可以认为Mybatis Mapper 就是DAO。
5.PO
PO(Persistant Object)持久对象。一个 PO 的数据结构对应着库中表的结构,表中的一条记录就是一个 PO 对象。与 DO 没有什么不同。
6.POJO
POJO(Plain Ordinary Java Object)简单的Java对象,实际就是没有逻辑的普通JavaBeans。上面提到的VO(View Object)、DTO、DO、PO 都是POJO。
7.结论
虽然 xxO 很多,但是真正有价值的并且还存在的就只有 DTO、VO(View Object)、领域模型 Entity 和 VO(Value Object)值对象( 参考《领域驱动设计》)了
参考:
- 《领域驱动设计》
- 《阿里巴巴 Java 开发手册1.4.0》
- 《百度百科》
- 《DTOs and ViewModels: when and how to use them》
- 《企业应用架构模式》