V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
uselessVisitor
V2EX  ›  问与答

关于 DO,DTO,VO

  •  
  •   uselessVisitor · 2020-11-10 11:21:31 +08:00 · 2193 次点击
    这是一个创建于 1504 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    13 条回复    2020-11-11 18:53:43 +08:00
    uselessVisitor
        1
    uselessVisitor  
    OP
       2020-11-10 12:10:40 +08:00 via Android
    没有大佬来解答一下吗。。
    goodboy95
        2
    goodboy95  
       2020-11-10 14:00:51 +08:00
    如果 IPage 是分出来的一页数据,按照意思来说是 DTO
    如果 IPage 是专门用来分页的一个 object,这就涉及到我的知识盲区了,毕竟我自己想一辈子都想不出这种分法
    uselessVisitor
        3
    uselessVisitor  
    OP
       2020-11-10 14:30:26 +08:00
    @goodboy95 IPage 这个对象是 mybatis-plus 自带的。。用来放查出来的一页数据
    howells
        4
    howells  
       2020-11-10 14:54:50 +08:00
    就是 vo 把,我对他们的理解就是,你接收请求的参数叫对象叫 dto,你返回的叫 vo
    howells
        5
    howells  
       2020-11-10 14:58:24 +08:00
    你应该把 Ipage 转成一个 VO 类,然后传出去
    uselessVisitor
        6
    uselessVisitor  
    OP
       2020-11-10 15:13:10 +08:00
    @howells 嗯。。那这样的话对于分页来说,我就在 service 组装 VO,然后给 controller 了,因为涉及到查询到的 current,size 等。。
    zhazi
        7
    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
        8
    howells  
       2020-11-10 15:38:47 +08:00
    @zhazi VO ( View Object ):显示层对象,通常是 Web 向模板渲染引擎层传输的对象。
    但是你看这个描述,它就不是数据库层描述的对象呀,就是给前端渲染的,是不是我们理解的不是同一个东西
    howells
        9
    howells  
       2020-11-10 15:40:09 +08:00
    @zhazi 我看你给的链接是在描述 select 之后的对象
    feidao158
        10
    feidao158  
       2020-11-10 15:48:57 +08:00
    @zhazi 小白请教个问题,VO 显示层对象如果不应该返回给请求方,那向请求方返回什么数据呢 或者应该怎么做呢
    zhazi
        11
    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
        12
    dddd1919  
       2020-11-10 23:31:30 +08:00   ❤️ 1
    mybatis 返回的是数据库的实体映射,对象和数据库的结构是完全对应的,所以应该直接用 model 或者你说的 DO 。
    DTO 理解上是系统内部的一种传输对象载体,比如 RPC 之间调用传输的数据结构。
    VO 作为外部交互使用的数据结构,负责内部实体和外部展示的相互转换,比如 http API 会用 VO,这样做的好处就是在转换时做到展示友好和屏蔽内部逻辑

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

    这三者之间的关系我理解的就是最底层 /数据映射层 DO,内部 /中间层 DTO,上层 /对外层 VO
    uselessVisitor
        13
    uselessVisitor  
    OP
       2020-11-11 18:53:43 +08:00
    @dddd1919 大佬,我这又有个问题,那么如果是一对多查询,使用 ResultMap 设置返回对象,那么返回值对应的实体类应该也是属于 DO 层的吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2653 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 00:20 · PVG 08:20 · LAX 16:20 · JFK 19:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.