VO、DTO、BO、PO区别
最近在项目中的model层看到有这么几个包:VO、DTO、BO、PO,每个包下有以包名结尾的类,这些存储数据的简单类,有什么作用呢?
通过一张图可以一眼清晰明了地看出它们的作用
VO(Value Object)值对象
VO就是展示用的数据,不管展示方式是网页,还是客户端,还是APP,只要是这个东西是让人看到的,这就叫VO
VO主要的存在形式就是js里面的对象(也可以简单理解成json)
DTO(Data Transfer Object)数据传输对象
这个传输通常指的前后端之间的传输
DTO是一个比较特殊的对象,他有两种存在形式:
在后端,他的存在形式是Go的结构体,通常在后端不需要关心怎么从Go的结构体转成json的,这个都是由一些成熟的框架帮你完成啦,比如Gin框架
在前端,他的存在形式通常是js里面的对象(也可以简单理解成json),也就是通过ajax请求的那个数据体
VO和DTO的区别
主要有两个区别
- 一个是字段不一样,VO根据需要会删减一些字段
- 另一个是值不一样,VO会根据需要对DTO中的值进行展示业务的解释
举个简单的例子
DTO可能是这样的
1 | { |
对于业务一来说只需要性别,而且因为是一个古风聊天室,也不能直接展示男,因此经过业务解释业务一的VO是
1 | { |
对于业务二来说只需要年龄,而且不需要精确的年龄,因此经过业务解释业务二的VO是
1 | { |
PO(Persistant Object)持久对象
PO比较好理解
简单说PO就是数据库中的记录,一个PO的数据结构对应着库中表的结构,表中的一条记录就是一个PO对象
通常PO里面除了get,set之外没有别的方法
对于PO来说,数量是相对固定的,一定不会超过数据库表的数量
等同于Entity,这俩概念是一致的
BO(Business Object)业务对象
BO就是PO的组合,负责计算以及组合PO对象
简单的例子比如说PO是一条交易记录,BO是一个人全部的交易记录集合对象
BO是一个业务对象,一类业务就会对应一个BO,数量上没有限制,而且BO会有很多业务操作,也就是说除了get,set方法以外,BO会有很多针对自身数据进行计算的方法
BO和DTO的区别
这两个的区别主要是就是字段的删减
BO对内,为了进行业务计算需要辅助数据,或者是一个业务有多个对外的接口
BO可能会含有很多接口对外所不需要的数据,因此DTO需要在BO的基础上,只要自己需要的数据,然后对外提供
在这个关系上,通常不会有数据内容的变化,内容变化要么在BO内部业务计算的时候完成,要么在解释VO的时候完成
实际应用
这几个概念很完整,我们在用的时候是必须按这个来做吗?
当然不是的,系统和系统的复杂度不同,协作水平不同,完全没有必要教条主义
以下有几条建议,可以帮助我们在实际中的使用:
- PO这个没法省,不管叫PO还是Entity,怎么着都得有
- 一些工具类的系统和一些业务不是很复杂的系统DTO是可以和BO合并成一个,当业务扩展的时候注意拆分就行
- VO是可以第一个优化掉的,展示业务不复杂的可以压根儿不要,直接用DTO
- 这也是最重要的一条,概念是给人用的,多人协作的时候一定要保证大家的概念一致