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

关于 DO,DTO,VO

  •  
  •   beichenhpy · 153 天前 · 942 次点击
    这是一个创建于 153 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    这三者之间的关系我理解的就是最底层 /数据映射层 DO,内部 /中间层 DTO,上层 /对外层 VO
    beichenhpy
        13
    beichenhpy   152 天前
    @dddd1919 大佬,我这又有个问题,那么如果是一对多查询,使用 ResultMap 设置返回对象,那么返回值对应的实体类应该也是属于 DO 层的吗?
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2453 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 18ms · UTC 12:39 · PVG 20:39 · LAX 05:39 · JFK 08:39
    ♥ Do have faith in what you're doing.