名词解析 — — 企业开发中的VO、DTO、BO、PO等
1 整体结构图
2 分别解析
2.1 DTO(Data Transfer Object) 数据传输对象【前后端交互】
DTO通常是前后端之间传输的对象
在后端:它的存在形式是Java对象,也就是controller层里面的东西
在前端:它通常是js里面的对象(json格式),也即是通过ajax请求回来的数据体
在微服务盛行的今天,服务和服务之间调用的传输对象能叫DTO吗?
DTO本身的一个隐含意思是要能够完整的表达一个业务模块的输出,如果服务和服务之间独立的话,我们一般来说是可以叫做DTO的。如果服务和服务之间不独立,不是一个完整的业务模块,拆开可能是因为计算复杂度或者性能的问题,那这就不能叫做DTO,只能是BO。
2.2 VO(View Object)视图对象【展示给页面】
VO就是和视图打交道的,不管展示方式是网页还是客户端又或者是APP,只要这个东西是让人看的,就叫VO。经历了视图的都归属于这个类,所以我们的输入输出类都是属于VO
VO主要的存在形式就是js里面的对象(可以简单理解为json)
2.3 VO与DTO区别【VO:后端给前端;DTO:前端给后端】
- 字段不一样,VO根据需要会删减一些字段
- 值不一样,VO会根据需要对DTO中的值进行展示业务的解释
举个简单的例子:
DTO可能是这样的
{
"gender":"男",
"age":35
}
对于业务1来说只需要性别,而且因为是一个古风聊天室,也不能直接展示"男",因此经过业务解释,业务1的VO是:
{
"gender":"公子"
}
对于业务2来说只需要年龄,而且不需要精确的年龄,因此经过业务解释,业务2的VO是
{
"age":"30~39"
}
- 课程列表查询接口,根据用户需求用户在手机端也要查询课程信息,此时课程查询接口是否需要编写手机端和PC端两个接口呢?
- 如果用户要求通过手机和PC的查询条件或查询结果不一样,此时就需要定义两个Controller课程查询接口,每个接口定义VO对象与前端传输数据。
- 手机查询:根据课程状态查询,查询结果只有课程名称和课程状态。
- PC查询:可以根据课程名称、课程状态、课程审核状态等条件查询,查询结果也比手机查询结果内容多。
- 此时,Service业务层尽量提供一个业务接口,即使两个前端接口需要的数据不一样,Service可以提供一个最全查询结果,由Controller进行数据整合。
2.4 PO(Persistent Object)持久对象【数据库】
PO对应的就是说数据库中的表结构,表中的一条记录对应的就是一个PO对象
通常来说,PO里面除了get、set方法之外没有其他的方法,对于PO来说,数量是相对固定的,一定不会超过数据库表的数量,等同于Entity
2.5 BO(Business Object)业务对象
BO就是PO的组合
比如:PO是一条交易记录,BO是一个人全部的交易记录集合对象
或者:PO1是交易记录,PO2是登录记录,PO3是商品浏览记录,PO4是添加购物车记录,PO5是搜索记录,那么BO就是个人网站行为对象
BO:业务对象,"一类业务就会对应一个BO",数量上没有限制,而且BO会有很多业务操作,也就是
说除了get、set方法外,BO会有很多针对自身数据进行计算的方法。那么为什么之前的图是横跨两
层呢?因为现在很多持久层框架爱自身就提供了数据组合的功能,因此BO有可能是在业务层由业务
来拼装而成,也可能是在数据库访问层由框架直接生成。很多情况下为了追求查询效率,框架跳过
PO直接生成BO的情况非常普遍,PO只是用来增删改使用。
2.6 BO与DTO区别
主要区别是:字段的删减【通常DTO:BO的删减版】
BO对内,为了进行业务计算需要辅助数据,或者是一个业务有多个对外的接口,BO可能会含有很多对外所不需要的数据,因此DTO需要在BO的基础上,只要自己需要的数据,然后对外提供。在这个关系上,通常不会有数据内容的变化,内容变化要么在BO内部业务计算的时候完成,要么在解释VO的时候完成。
2.7 DO(Data Object / Domain Object)
- DO是在阿里巴巴的开发手册中定义,DO(Data Object)其实等同于PO
- 另一种版本的DO是DDD(Domain-Driven Design)领域驱动设计中的,DO(Domain Object),等同于上面的BO
2.8 TO(Transfer Object)
在应用程序不同tie(关系)之间传输的对象
2.9 总结
名称 | 含义 |
---|---|
VO(View Object) | 视图对象,和视图打交道 |
PO(Persistent Object) | 持久层对象,对应数据库 |
DTO(Data Transfer Object) | 数据传输对象,与前端打交道,传给前端的 |
BO(Business Object) | 业务对象,与内部业务逻辑打交道 |
TO(Transfer Object) | 传输对象,不同关系之间的传输对象 |
一个DTO可能对应多个VO
,为了适配
参考文章:
https://zhuanlan.zhihu.com/p/102389552
https://blog.csdn.net/qq_40262372/article/details/112527073