【java】 对命名规范的思考——VO,BO,PO,DO,DTO是什么

news2025/8/1 1:23:46

作为Java开发人员免要接触VO,BO,PO,DO,DTO,但很多朋友对这些概念一直以来都是云里雾里,本来是规范性的东西,使用起来却反而导致更加混乱了。先附上我自己常用的命名习惯:

数据对象:xxxPO,xxx即为数据表名。(也可DO)
数据传输对象:xxxDTO,xxx为业务领域相关的名称。
展示对象:xxxVO,xxx一般为网页名称。
业务对象:xxxBO,xxx是业务名称。

整体的关系大概如下图所示:
在这里插入图片描述
要想理解就
VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。

BO(Business Object):业务对象,把业务逻辑封装为一个对象,这个对象可以包括一个或多个其它的对象。

PO(Persistent Object):持久化对象,它跟持久层(通常是关系型数据库)的数据结构形成一一对应的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若干个)就对应PO的一个(或若干个)属性。

DO(Domain Object):领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。

DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,更符合泛指用于展示层与服务层之间的数据传输对象。

最常用的两兄弟:VO和DTO

VO实话说就是用于展示的,不管展示方式是网页,还是客户端,还是APP,只要是让人看到的,我们就把它封装为VO,StudentVO,TeacherVO等等。。。

DTO是展示层与服务层之间传递数据的对象,对于绝大部分的应用场景来说,DTO和VO的属性值基本是一致的,而且他们通常都是POJO,那么既然有了VO,为什么还需要DTO呢?

比如学校人员管理系统中包含教师和学生。服务层有一个getPersonInfo的方法返回用户信息,包含name、age。对于服务层来说,DTO只从语义上定义,可以是这样的teacherDTO:

{
	"name":张三
	"age":25
}

但为了数据隐私和安全考虑,非张三且非管理员的用户看到的应该是模糊的信息,可以用VO做一下转换,例如teacherVO:

{
	"name":张老师
	"age":20~30
}

虽然说字段是一致的,但是根据职责单一原则,服务层只负责业务,与具体的表现形式无关,DTO不应该出现与表现形式的耦合,DTO定义的是原始数据,VO再对DTO数据进行解释。


BO和PO
PO是持久对象,是实体和数据库字段的对应,一个PO的数据结构对应着库中表的结构,表中的一条记录就是一个PO属性,大多数情况下,PO仅仅作为PO只是用来增删改使用。

BO是业务对象,对应的是某个具体的业务块,可以包含多个属性、对象。

简单点来讲,我们可以把BO看作是多个PO的组合。下面的例子可以简单说明一下:

PO1是显卡对象,PO2是主板对象,PO3是cpu对象,PO4是添加电源对象,BO是主机对象,BO对象:{PO1;PO2;PO3;PO4}。

BO和DTO
搞清楚BO和PO各自的用途后,我们会发现BO和DTO有重叠功能,一样可以对PO进行排列组合,那BO的存在的意义是什么呢?

从用途上进行根本的区别,BO是业务对象,DTO是数据传输对象,虽然BO也可以排列组合数据,但它的功能是对内的,比如上个例子中的BO对象包括{PO1;PO2;PO3;PO4}还有其他字段属性,但在提供对外接口时,BO对象中的某些属性对象可能用不到或者不方便对外暴露,那么此时DTO只需要在BO的基础上,抽取自己需要的数据,然后对外提供。

在这个关系上,通常不会有数据内容的变化,内容变化要么在BO内部业务计算的时候完成,要么在解释VO的时候完成。

DO和PO
DO是领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。事实上,DO和PO在绝大部分情况下是一一对应的。阿里巴巴的开发手册中的定义DO等同于PO,即与数据库表结构一一对应,通过DAO层向上传输数据源对象。

总结
VO,BO,PO,DTO这样分层还是很有意义的。尤其在团队成员较多的情况下,结构更加一目了然,同时也能很大程度避免多端系统数据所需不一致时,有人修改属性影响其他页面。
但也完全没有必要教条主义,把这些全部用上,需要根据所开发的业务复杂度来取舍,如果本身业务逻辑不负责,照搬全上反而让开发变的更复杂。例如业务不复杂,根本没有多端展示的差异化,VO可以直接拿掉,直接使用DTO传输到前端数据即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/16160.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IVIF:multi-scale densenet

UNFusion: A unified multi-scale densely connected network for infrared and visible image fusion (UNFusion: 用于红外和可见光图像融合的统一多尺度密集连接网络) 大多数基于深度学习的方法主要侧重于卷积操作来提取局部特征,但没有充…

推荐系统最通俗介绍

文章目录1.推荐系统概念2.推荐系统发展历史3.个性化推荐系统框架4.部分案例4.1 搜狐视频个性化推荐架构4.2 今日头条推荐系统架构4.3 Netflix推荐系统架构图5. 视频推荐系统流程设计总结资料整理,来源于北大刘宏志教授讲座内容。 在介绍推荐系统前,我们先…

【目标检测】池化层(pooling)的反向传播是怎么实现的

目录:池化层的反向传播是怎么实现的一、前言二、平均池化二、最大池化四、最大池化的数学原理一、前言 卷积神经网络中一个不可导的环节就是Pooling池化操作,因为Pooling池化操作使得feature map的尺寸发生变化,假如做222\times 222的池化&a…

一.node的事件处理;二.node的全局对象;三.node的readline模块;四.node的Web编程

目录 一.node的事件处理 1.node采用的事件驱动模式来进行事件处理的:只有当事件被触发时才执行相关程序 2.node是单线程运行的:采用事件轮询方式,不断的查询事件队列中的消息,然后根据消息执行对应的回调函数 3.node事件机制中…

硬核Vue3响应式原理解析,为你保驾护航渡过寒冬

前言 大家好,我是落叶小小少年,虽然比较菜,虽然才开始写作分享,我始终相信 核心demo更容易理解深的技术点每一次基础的学习都是对知识的巩固 因为从年初就开始使用Vue3了,现在才来学习Vue3,但是也不算晚…

yolo5 训练无人人机识别系统

环境搭建: 安装驱动 点击鼠标右键,如果出现NVIDIA图标,点开,出现如下图片 我的显卡是1650,根据显卡的型号去官网找相应的驱动下载就好了。驱动官网 安装好之后,打开命令行cmd,输入如下指令&a…

登录功能(基于SpringBoot+MP+Vue实现的功能)

目录 前言 一、UserMapper层代码分析 二、UserService层代码分析 1.UserService接口 2.UserServiceImpl实现类 3.UserController层代码分析 4.拦截器设置 5.展示效果图 总结 前言 登录功能是web开发中常见的功能,也是学后端必须要练得一个功能,本…

【JavaWeb】手写一个Servlet+JSP+JavaBean分页

✅✅作者主页:🔗孙不坚1208的博客 🔥🔥精选专栏:🔗JavaWeb从入门到精通(持续更新中) 📋📋 本文摘要:本篇文章主要分享如何使用ServletJSPJavaBean…

C++对象拷贝

前言:本教程使用到的工具是vs2010;能用VC6就用VC6,因为vs2010生成的汇编代码可能有点乱;此外,文章中涉及的汇编,我都会予以解释,所以放心观看。 目录 一、什么是对象拷贝? 二、C对…

【微服务】SpringCloud微服务剔除下线源码解析

💖 Spring家族及微服务系列文章 ✨【微服务】SpringCloud微服务续约源码解析 ✨【微服务】SpringCloud微服务注册源码解析 ✨【微服务】Nacos2.x服务发现?RPC调用?重试机制? ✨【微服务】Nacos通知客户端服务变更以及重试机制 ✨【…

SpringBoot SpringBoot 开发实用篇 4 数据层解决方案 4.4 Redis 下载安装与基本使用

SpringBoot 【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇4 数据层解决方案4.4 Redis 下载安装与基本使用4.4.1 问题引入4.4.2 …

Linux Mint(Ubuntu)上 安装 效率神器 utools

Linux Mint(Ubuntu)上 安装 效率神器 utools 我的 Windows 系统的笔记本只有 256G 固态,磁盘已经快用满了,最近想装个 Linux 玩玩,1 选择了 Linux Mint,然后就在闲置的移动硬盘上安装了 Linux Mint 21 cin…

Centos 安装Java库的多种方式

安装jdk(介绍三种方法) 查看java版本:java -version 方法一:利用yum源来安装jdk(此方法不需要配置环境变量) 查看yum库中的java安装包 :yum -y list java* 安装需要的jdk版本的所有java程序:yum -y instal…

纯正体验,极致商务 | 丽亭酒店聚焦未来赛道,实现共赢发展

10月28日,锦江酒店(中国区)“齐鲁集锦 共话未来”投资人交流会在济南盛大召开,面向华东地区投资人,行业专家、商旅客、品牌代表齐聚一堂,共同聚焦酒店市场投资新价值,商讨新时代酒店行业新机遇,多维探索酒店…

蓝牙数据包协议解析

1.前言 由于工作需要,初次接触蓝牙。从最基础的知识开始了解。 引用wiki中的介绍: 蓝牙(英语:Bluetooth),一种无线通讯技术标准,用来让固定与移动设备,在短距离间交换资料&#xff…

第一章:Spring流程执行步骤

Spring执行流程图 注意观察:每一个执行步骤的结果都会返回到DispatcherServlet ,然后再出发调用, 所以是请求接口的入口也是出口。 简单了解几个大类的走的流程和具体功能 DispatcherServlet 类 中文调度应用程序,而Servlet就…

libusb系列-007-Qt下使用libusb1.0.26源码

libusb系列-007-Qt下使用libusb1.0.26源码 文章目录libusb系列-007-Qt下使用libusb1.0.26源码摘要安装编译环境确认需要的文件开始编译错误1:找不到文件错误2:expected错误3:SCM_CREDENTALS错误4:类型冲突错误5 assert断言错误错误…

低代码平台和无代码平台有什么区别

低代码(LowCode)/无代码(NoCode)”是技术界近几年的热门词汇之一,随着企业数字化发展的深入,越来越多的场景化需求要求企业具备更加灵活敏捷的应用开发能力,传统应用开发模式周期长、技术人员能力要求高,无…

OWASP API SECURITY TOP 10

目录 1. API 安全风险 2. 细说TOP10 1. Broken Object Level Authorization 2. Broken User Authentication 3 Excessive Data Exposure 4 Lack of Resources & Rate Limiting 5 Broken Function Level Authorization 6 Mass Assignment 7 security misconfigura…

redis哨兵系列1

需要配合源码一起康~ 9.1 哨兵基本概念 官网手册yyds:https://redis.io/docs/manual/sentinel/ redis主从模式,如果主挂了,需要人工将从节点提升为主节点,通知应用修改主节点的地址。不是很友好,so Redis 2.8之后开…