随着编程工业化水平的不断加深,各种编程模型层出不穷,随之而来的也有各种新的概念,今天学习时遇到领域模型VO、PO、DO、DTO相关概念,谨以此文作为备注
先以一个时序图建立简单模型来描述上述对象在三层架构应用中的位置
下面按照时序图从左到右依次解释VO、DTO、DO、PO的概念,并附上个人理解
3.1 VO
Vo全称为View Object, 即视图对象。从时序图中可以看出,其主要作用为前端页面所展示的数据,也就是js里面的对象(可以简单理解成json)
3.2 DTO
DTO全称为Data Transfer Object, 即数据传输对象。从时序图中可以看出,其主要作用为展示层和服务层之间(前端和后端)进行数据传输
3.3 DO
DO全称为Domain Object, 即领域对象,其主要概念为从现实世界中抽象出来的有形或无形的业务实体,服务层上调用DO完成业务,然后将DO转为DTO在前后端进行传输,时序图中可以看出,DTO和DO对象主要是在业务层进行转换,其区别见后文
3.4 PO
PO全称为Persistent Object, 即持久化对象。其主要概念为用于与数据库表中形成映射关系,通常一张表对应一个PO,等同于Entity从时序图中可以看出,其主要作用为服务层和数据层之间(前端和后端)进行数据传输
主要容易混淆的是VO和DTO、DO和DTO,以下依次对其进行说明
4.1 VO和DTO之间的区别
VO主要用于前端页面的数据展示,而DTO主要是在前端和后端之间进行数据传输,区别如下
1) 字段不一样,VO可能会删减某些字段
DTO可能是这样的
// An highlighted block
{
"gender": "男",
"age": 20
}
但是对于前端页面展示而言,可能并不需要展示这么多数据,因此VO可能会删减某些字段,例如业务一的前端页面只需展示gender,因此业务一的VO可能就是这样的
{
"gender": "男"
}
2) 值不一样,VO可能会对DTO中的值进行进一步解释说明
DTO照样如上图所示,但是对于业务二而言,其可能是一款古风游戏,因此VO需要对DTO中的gender和age属性进行进一步解释,因此业务二的VO可能就是这样的
{
"gender": "公子",
"age": "弱冠"
}
4.2 DTO和DO之间的区别
DO主要用于服务层上的业务处理,而DTO主要是在前端和后端之间进行数据传输,区别如下
1) 字段不一样,DTO可能会删减某些字段,且DO具有业务方法
对于DO而言,可能业务处理需要用到用户的password这一字段然后进行用户信息查询,因此DO可能就是这样的
{
"username": "张三",
"password": "123456"
}
但是在前端后端进行数据传输时,为了安全是不能将password这一属性传回给前端的,因此其DTO可能就是这样的
{
"username": "张三"
}
注: 从时序图中也可以看到,DO和DTO是在服务层进行的转换,且需要注意的是PO只是代表数据库表结构的映射,因此服务层一般不会直接用PO进行服务处理,这也是为啥需要DO的原因
这几个概念很完整,我们在用的时候是必须按这个来做吗?当然不是的,系统和系统的复杂度不同,协作水平不同,完全没有必要教条主义,这些概念全上
上哪些概念,省哪些,建议如下:
5.1 PO这个没法省,不管叫PO还是Entity,怎么着都得有
5.2 一些工具类的系统和一些业务不是很复杂的系统DTO是可以和BO合并成一个,当业务扩展的时候注意拆分就行
5.3 VO是可以第一个优化掉的,展示业务不复杂的可以压根儿不要,直接用DTO
5.4 概念是给人用的,多人协作的时候一定要保证大家的概念一致