VO、BO、PO、DO、DTO的区别

news/2024/11/8 16:51:37/

随着编程工业化水平的不断加深,各种编程模型层出不穷(比如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(View Object) 值对象

VO就是展示用的数据,不管展示方式是网页,还是客户端,还是APP,只要是这个对象是让人看到的,这就叫VO

VO主要的存在形式就是js里面的对象(也可以简单理解成json)

VO和DTO的区别

主要有两个区别:

一个是字段不一样,VO根据需要会删减一些字段;

另一个是值不一样,VO会根据需要对DTO中的值进行展示业务的解释;

举个简单的例子,

DTO可能是这样的:

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

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

{ "gender":"公子" 
} 

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

{ "age":"20~25" 
} 

PO(Persistent Object) 持久对象

简单来说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的时候完成

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的区别 - 知乎


http://www.ppmy.cn/news/428027.html

相关文章

dynamic proposa

又一个自称厉害的哦~~ 大伙去试试把 论文地址:https://arxiv.org/pdf/2207.05252.pdf 动态候选较大程度提升检测精度的高效目标检测 目标检测是一项基本的计算机视觉任务,用于对给定图像中的目标进行定位和分类。 大多数最先进的检测方法利用固定数量…

dto do po vo 区分

1、实体 实体与我们都数据库表是一一对应的,实体中的每个字段与表中的字段也是一一对应的。 2、do 接收应用层传给domain层的参数(也可以用实体接收)。 domain层接收的参数必须是在domain层存在的对象 3、po domain层返回应用层结果,使用po(也可以用…

VO、DTO、DO、PO的区别和用处

VO、DTO、DO、PO的区别和用处 一、VO、DTO、DO、PO概念二、VO与DTO的区别和应用三、DTO与DO的区别和应用四、DO与PO的区别和应用五、更细分还有BO、AO、POJO、DAO 一、VO、DTO、DO、PO概念 VO(View Object):视图对象,用于展示层&…

odoo 关于many2many 和one2many

many2many (0,0,{values}) 根据values里面的信息新建一个记录。 (1,ID,{values})更新idID的记录(写入values里面的数据) (2,ID) 删除idID的数据(调用unlink方法,删除数据以及整个主从数据链接关系) (3,ID) 切断主从…

VO、DTO、DO、PO的概念、区别和用处

一、概念 VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。 DTO(Data Transfer Object):数据传输对象&#xff…

PO,BO,VO,DTO,DO的区别

1、PO PO:Persistan Object(持久对象)业务:po对象的属性字段与数据库表结构字段一 一对应举例: 个⼈信息表中分别有:id,name,age,sex,birthday PO对象中的属性…

odoo 对 many2many one2many的操作

many2many (0,0,{values}) 根据values里面的信息新建一个记录。 (1,ID,{values})更新idID的记录(写入values里面的数据) (2,ID) 删除idID的数据(调用unlink方法,删除数据以及整个主从数据链接关系) (3,ID) 切断主从…

DTO-VO-DO-Query理解

POJO/PO/DO/Entity/DTO/VO/Query个人理解 POJO:Plain Ordinary Java Object,普通java对象。PO:Persistent Object,持久化对象。DO:Data Object,数据对象。Entity:实体对象。DTO:Dat…