随着编程工业化水平的不断加深,各种编程模型层出不穷(比如MVC,MVP等等),伴随着这些编程模型,又有一大批新的概念蜂拥而至,什么VO,BO,PO,DO,DTO之类的,这些新的概念一直以来都是云里雾里,网上虽然也有不少文章来区分这些概念,但看下来基本都是几篇相同的文章转载来转载去,这些文章本身也说的不明,有些还互相矛盾,再加上有些文章在简化系统里面来使用这些概念,让人越看越迷糊

什么原因造成了这种混乱的状态,就不深究了,感觉也很难究出所以然来
因此让我们立足这些概念本身,达成对概念理解的一致性,就足够了,这也是这边文章的主要目的
鉴于专业术语的解释互联网上太多,一搜一大把,我就不重复一遍术语了,而且说实话,术语太抽象,不利于理解,看完其实没解决啥疑惑,我会尽量用大白话(人话)来做解释,争取让大家都能看明白

废话不多说,先来看张图
看完图估计大部分人就已经有了一个直观的感受了

面对这个图,让我们先从承上启下的DTO开始入手
DTO(Data Transfer Object)数据传输对象
这个传输通常指的前后端之间的传输
DTO是一个比较特殊的对象,他有两种存在形式:
在后端,他的存在形式是java对象,也就是在controller里面定义的那个东东,通常在后端不需要关心怎么从json转成java对象的,这个都是由一些成熟的框架帮你完成啦,比如spring框架
在前端,他的存在形式通常是js里面的对象(也可以简单理解成json),也就是通过ajax请求的那个数据体
这也是为什么把他画成横跨两层的原因

这里可能会遇到个问题,现在微服务盛行,服务和服务之间调用的传输对象能叫DTO吗?
我的理解是看情况
DTO本身的一个隐含的意义是要能够完整的表达一个业务模块的输出
如果服务和服务之间相对独立,那就可以叫DTO
如果服务和服务之间不独立,每个都不是一个完整的业务模块,拆开可能仅仅是因为计算复杂度或者性能的问题,那这就不能够叫做DTO,只能是BO

VO(Value Object)值对象
VO就是展示用的数据,不管展示方式是网页,还是客户端,还是APP,只要是这个东西是让人看到的,这就叫VO
VO主要的存在形式就是js里面的对象(也可以简单理解成json)

VO和DTO的区别
主要有两个区别
一个是字段不一样,VO根据需要会删减一些字段
另一个是值不一样,VO会根据需要对DTO中的值进行展示业务的解释
举个简单的例子
DTO可能是这样的

{"gender":"男","age":35
}

对于业务一来说只需要性别,而且因为是一个古风聊天室,也不能直接展示男,因此经过业务解释业务一的VO是

{"gender":"公子"
}

对于业务二来说只需要年龄,而且不需要精确的年龄,因此经过业务解释业务二的VO是

{"age":"30~39"
}

PO(Persistant Object)持久对象
PO比较好理解
简单说PO就是数据库中的记录,一个PO的数据结构对应着库中表的结构,表中的一条记录就是一个PO对象
通常PO里面除了get,set之外没有别的方法
对于PO来说,数量是相对固定的,一定不会超过数据库表的数量
等同于Entity,这俩概念是一致的

BO(Business Object)业务对象
BO就是PO的组合
简单的例子比如说PO是一条交易记录,BO是一个人全部的交易记录集合对象
复杂点儿的例子PO1是交易记录,PO2是登录记录,PO3是商品浏览记录,PO4是添加购物车记录,PO5是搜索记录,BO是个人网站行为对象
BO是一个业务对象,一类业务就会对应一个BO,数量上没有限制,而且BO会有很多业务操作,也就是说除了get,set方法以外,BO会有很多针对自身数据进行计算的方法
为什么BO也画成横跨两层呢?原因是现在很多持久层框架自身就提供了数据组合的功能,因此BO有可能是在业务层由业务来拼装PO而成,也有可能是在数据库访问层由框架直接生成
很多情况下为了追求查询的效率,框架跳过PO直接生成BO的情况非常普遍,PO只是用来增删改使用

BO和DTO的区别
这两个的区别主要是就是字段的删减
BO对内,为了进行业务计算需要辅助数据,或者是一个业务有多个对外的接口,BO可能会含有很多接口对外所不需要的数据,因此DTO需要在BO的基础上,只要自己需要的数据,然后对外提供
在这个关系上,通常不会有数据内容的变化,内容变化要么在BO内部业务计算的时候完成,要么在解释VO的时候完成

OK,到这里这些关系基本就理清楚了

等等,DO是什么
DO呢,标题不是还有个DO么?
上面这些概念基本上已经涵盖了全部的流程,DO只是跟其中一个概念相同
但是跟哪个概念相同呢?
现在主要有两个版本
一个是阿里巴巴的开发手册中的定义
DO( Data Object)这个等同于上面的PO
另一个是在DDD(Domain-Driven Design)领域驱动设计中
DO(Domain Object)这个等同于上面的BO

最后,让我们再说说实际应用
这几个概念很完整,我们在用的时候是必须按这个来做吗?
当然不是的,系统和系统的复杂度不同,协作水平不同,完全没有必要教条主义,这些概念全上
上哪些概念,省哪些,我给一些实际建议
1,PO这个没法省,不管叫PO还是Entity,怎么着都得有
2,一些工具类的系统和一些业务不是很复杂的系统DTO是可以和BO合并成一个,当业务扩展的时候注意拆分就行
3,VO是可以第一个优化掉的,展示业务不复杂的可以压根儿不要,直接用DTO
4,这也是最重要的一条,概念是给人用的,多人协作的时候一定要保证大家的概念一致,赶紧把这篇文章转发给跟你协作的人吧


欢迎关注公众号,共同交流,共同进步

一篇文章讲清楚VO,BO,PO,DO,DTO的区别相关推荐

  1. VO BO PO DO DTO DAO POJO概念及区别

    VO BO PO DO DTO DAO POJO 概念及区别 1.VO( value object) 即值对象 VO就是展示用的数据,不管展示方式是网页,还是客户端,还是APP,只要是这个东西是让人看 ...

  2. Java 开发中 一篇文章讲清楚VO,BO,PO,DO,DTO的区别

    ⼀.概念定义 1.PO:Persistant Object(持久对象),基本上,PO对象中的属性就是对应着数据库中表的字段,加上⼀些get和set⽅法的组成.例:个⼈信息表中分别有:id,name,a ...

  3. java中的bo和do_一篇文章讲清楚VO,BO,PO,DO,DTO的区别

    随着编程工业化水平的不断加深,各种编程模型层出不穷(比如MVC,MVP等等),伴随着这些编程模型,又有一大批新的概念蜂拥而至,什么VO,BO,PO,DO,DTO之类的,这些新的概念一直以来都是云里雾里 ...

  4. 转贴一个关于DTO DAO VO BO PO POJO的^_^

    DTO DAO VO BO PO POJO- - potian 写道: 辨别一些名词: 1.VO:实际上很模糊,通常指ValueObject和ViewObject 2. ViewObject,界面展现 ...

  5. POJO/DTO/DO/EO/VO/BO/PO/AO的含义和使用

    关于POJO/DTO/DO/EO/VO/BO/PO/AO 本文讨论 POJO/DTO/DO/EO/VO/BO/PO/AO 的定义,另外讨论了这些xO在controller.service.dao/ma ...

  6. vo、po、dto、bo、pojo、entity、mode如何区分

    Java Bean:一种可重用组件,即"一次编写,任何地方执行,任何地方重用".满足三个条件 类必须是具体的和公共的 具有无参构造器 提供一致性设计模式的公共方法将内部域或暴露成员 ...

  7. java web分层和层间数据传递 vo bo po (转载)

    还记得97年左右开始的胖客户机和瘦客户机之争吗?之后又是CS和BS之争,然后又是两层和多层之争...,十年之后的今天我们再回过头看这些争论,一切似乎看起来都那么理所应当:程序怎么能不分层啊?可是再想一 ...

  8. java web分层和层间数据传递 vo bo po

    还记得97年左右开始的胖客户机和瘦客户机之争吗?之后又是CS和BS之争,然后又是两层和多层之争...,十年之后的今天我们再回过头看这些争论,一切似乎看起来都那么理所应当:程序怎么能不分层啊?可是再想一 ...

  9. entity、bo、vo、po、dto、pojo如何理解及相互转化

    先介绍一下我们经常会用到的一些对象:entity.POJO.VO.DTO.BO和PO. 概念: Entity 最常用实体类,基本和数据表一一对应,一个实体一张表. Bo(business object ...

最新文章

  1. Python基础编程——字典
  2. 谈谈相控阵雷达为何如此先进
  3. 网站推广中的优化雷区作为网站推广专员你了解多少?
  4. 侠客X开发工作已经持续了2个月左右了。
  5. ABAP应用服务器的HTTP响应状态码(Status Code)
  6. P1282-多米诺骨牌【dp,背包】
  7. 快乐的Linux命令行--读书笔记1
  8. 物理服务器转虚拟路径,服务器配置虚拟路径
  9. php curl发送delte,php Curl如何发起POST DELETE GET POST请求
  10. 设计模式 轮子哥的论点
  11. Spring Boot+HATEOAS快速介绍与示例
  12. linux lvs 存储层,LVS集群配置之LVS介绍
  13. go并发编程实战 第二版 pdf_完美!啃透P9大佬这份完整版的《并发编程宝典》,成为Offer收割机...
  14. 应用Rational工具简化基于J2EE项目(五)架构与设计
  15. 小米8se线刷机(卡刷机一般解决不了问题,所以不用卡刷)
  16. 根据sam文件计算reads的GC含量
  17. 核桃编程Delta Lake实时数仓应用实践
  18. ¶àÀ­AÃεĴó½á¾Ö
  19. 阿里云 ECS 服务器上如何搭建 Hadoop 集群详细步骤图解
  20. Nginx 配置图片反向代理

热门文章

  1. Spring的7种事务传播方式
  2. Istio服务网格实践指南 学习笔记(二) Istio架构
  3. Win11 文件夹打开慢或卡顿解决方案
  4. 移动硬盘打开后点击右键电脑就卡死,资源管理就崩溃
  5. MEM/MBA英语基础(09)倒装句
  6. PHP云软件短信接口,短信接口DEMO-PHP
  7. <POSTGRESQL修炼之道:从小工到专家>之逻辑结构管理(6-11结)
  8. vnc server下载,vnc server下载怎么下载?教程详解
  9. MySQL之基准测试
  10. P问题、NP问题、NPC问题、多项式时间