关于 DO,DTO,VO

2020-11-10 11:21:31 +08:00
 uselessVisitor

最近在看阿里规约。 阿里对于 DO,DTO,VO 的规约为

DO ( Data Object ):此对象与数据库表结构一一对应,通过 DAO 层向上传输数据源对象。
DTO ( Data Transfer Object ):数据传输对象,Service 或 Manager 向外传输的对象。
VO ( View Object ):显示层对象,通常是 Web 向模板渲染引擎层传输的对象。

但是我在使用 mybatis 分页时,一般会在 Controller 里直接调用分页方法,返回 IPage 对象 那么 这个时候 Ipage 对象对应的泛型应该用哪个呢? DO 还是 DTO?

2191 次点击
所在节点    问与答
13 条回复
uselessVisitor
2020-11-10 12:10:40 +08:00
没有大佬来解答一下吗。。
goodboy95
2020-11-10 14:00:51 +08:00
如果 IPage 是分出来的一页数据,按照意思来说是 DTO
如果 IPage 是专门用来分页的一个 object,这就涉及到我的知识盲区了,毕竟我自己想一辈子都想不出这种分法
uselessVisitor
2020-11-10 14:30:26 +08:00
@goodboy95 IPage 这个对象是 mybatis-plus 自带的。。用来放查出来的一页数据
howells
2020-11-10 14:54:50 +08:00
就是 vo 把,我对他们的理解就是,你接收请求的参数叫对象叫 dto,你返回的叫 vo
howells
2020-11-10 14:58:24 +08:00
你应该把 Ipage 转成一个 VO 类,然后传出去
uselessVisitor
2020-11-10 15:13:10 +08:00
@howells 嗯。。那这样的话对于分页来说,我就在 service 组装 VO,然后给 controller 了,因为涉及到查询到的 current,size 等。。
zhazi
2020-11-10 15:34:27 +08:00
https://docs.oracle.com/cd/A97335_02/apps.102/bc4j/developing_bc_projects/bc_awhatisavo.htm
希望楼上不要误导人

vo 两种解释 value object, view object
这两种 VO 都不应该返回给请求方

引用 DTO 是为了与业务 Domain 解耦合,在请求时对请求参数进行聚合
howells
2020-11-10 15:38:47 +08:00
@zhazi VO ( View Object ):显示层对象,通常是 Web 向模板渲染引擎层传输的对象。
但是你看这个描述,它就不是数据库层描述的对象呀,就是给前端渲染的,是不是我们理解的不是同一个东西
howells
2020-11-10 15:40:09 +08:00
@zhazi 我看你给的链接是在描述 select 之后的对象
feidao158
2020-11-10 15:48:57 +08:00
@zhazi 小白请教个问题,VO 显示层对象如果不应该返回给请求方,那向请求方返回什么数据呢 或者应该怎么做呢
zhazi
2020-11-10 15:52:51 +08:00
@howells
关于这个 VO 的解释都是出自阿里的 java 开发规约。每个领域概念出现是为了解决问题而出现的。
DTO/VO 的概念重复。
有的公司会对给请求叫 xxxRequestObject 返回值 xxxResponseObject
这无可厚非所有领域概念都是人抽象出来的。
如果大多数人能从这个抽象概念中获取到实质的好处。那么这个概念就被推崇。如果不能那么这个概念只能提高架构的复杂度。加速代码腐坏。

https://stackoverflow.com/questions/1612334/difference-between-dto-vo-pojo-javabeans

Early J2EE literature used the term value object to describe a different notion, what I call a Data Transfer Object. They have since changed their usage and use the term Transfer Object instead.
dddd1919
2020-11-10 23:31:30 +08:00
mybatis 返回的是数据库的实体映射,对象和数据库的结构是完全对应的,所以应该直接用 model 或者你说的 DO 。
DTO 理解上是系统内部的一种传输对象载体,比如 RPC 之间调用传输的数据结构。
VO 作为外部交互使用的数据结构,负责内部实体和外部展示的相互转换,比如 http API 会用 VO,这样做的好处就是在转换时做到展示友好和屏蔽内部逻辑

你说的 controller 直接调用 mybatis 是不太规范的方式,应该把 mybatis 调用相关的处理逻辑放在 service 层,把结果返回给 controller,由 controller 转换成 VO 后返回给调用方,或者 service 直接转换好 VO 返回去

这三者之间的关系我理解的就是最底层 /数据映射层 DO,内部 /中间层 DTO,上层 /对外层 VO
uselessVisitor
2020-11-11 18:53:43 +08:00
@dddd1919 大佬,我这又有个问题,那么如果是一对多查询,使用 ResultMap 设置返回对象,那么返回值对应的实体类应该也是属于 DO 层的吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/723524

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX