简述Java项目中VO,BO,PO,DO,DTO之类的文件概念、易混点

VO,BO,PO,DO,DTO

    • 概念
    • 易混点
      • 一:VO和DTO
        • - 让我们通过一个实例来阐释DTO和VO的概念及其应用差异:
          • 小结:VO专注于展示,而DTO则用于数据的传输和业务逻辑的处理。
      • 二:BO和PO
          • 小结:单个 PO1、PO2、PO3、... 整合为 BO:{PO1、PO2、PO3、... }
      • 三:BO和DTO
      • 四:DO
    • 一张图看的更直观
    • 总结

  • 在业务复杂且对团队协作有高要求的环境中,虽然不遵循规范的程序可能短期内仍能运行无误,但长期来看,遵循这些规范将显著提升代码的扩展性和可读性。这些规范是前辈们通过丰富经验积累的智慧结晶,我们应当珍视并应用它们,以促进项目的持续健康发展。
  • 对于Java开发者而言,经常需要处理诸如VO(视图对象)、BO(业务对象)、PO(持久化对象)、DO(领域对象)和DTO(数据传输对象)等概念。然而,许多开发人员对这些术语的理解并不清晰,导致在团队开发中出现使用上的混乱。
  • 这些本应带来规范和清晰度的工具,反而因为不恰当的使用而增加了混乱。为了改善这一状况,我们需要加强对这些概念的理解,并在项目中建立明确的使用指南,以确保团队成员能够正确、一致地应用它们,从而提高开发效率和代码质量。

概念

  • VO(View Object)视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。

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

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

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

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

易混点

一:VO和DTO

在软件开发中,VO(通常理解为视图对象)是我们最常使用的组件之一。它负责封装展示层的数据,无论是在网页、桌面客户端还是移动应用中,只要数据需要被展示给用户,VO就是理想的选择。尽管网上对VO的定义(值对象或视图对象)存在不同声音,我更倾向于将其视为视图对象,因为它的核心作用是作为用户界面的数据载体。

VO容易混淆的是DTO。DTO主要用于在展示层和业务逻辑层之间传输数据。在许多情况下,DTO和VO的属性可能相同,且它们都是简单的POJO(Plain Old Java Objects)。这可能会让人疑惑:既然已经有了VO,为什么还需要DTO?

- 让我们通过一个实例来阐释DTO和VO的概念及其应用差异:

假设一家公司的后台服务提供了一个getUser方法,该方法返回一个包含sex(性别)和age(年龄)字段的系统用户对象。在服务层,DTO的设计仅从语义上进行定义,可能表现为:

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

此服务被多个客户端(如不同的门户网站)使用,而这些客户端对展示层的要求各有差异。例如,管理端需要展示用户的实际年龄,而应用端为了保护用户隐私,可能只展示一个年龄范围

针对这些需求,我们可以定义不同的VO:

管理端VO:

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

应用端VO:

{
  "gender": "男",
  "ageRange": "30~40"
}

这个例子清晰地展示了DTO的必要性。根据单一职责原则,服务层专注于业务逻辑,与具体的数据表现形式无关。DTO应保持与表现形式的解耦,它定义了业务逻辑的原始数据。然后,VO根据客户端的具体需求对DTO中的数据进行适当的转换和解释。通过这种方式,VO和DTO的用法和它们在系统架构中的角色变得更加明确。

小结:VO专注于展示,而DTO则用于数据的传输和业务逻辑的处理。

二:BO和PO

PO(持久对象)直接映射数据库表,通常用于基本的数据操作如增删改。BO(业务对象)则更为复杂,它代表具体的业务逻辑,可能包含多个PO。简而言之,BO是业务逻辑的集合,而PO是数据库记录的简单映射

以个人网站行为为例,我们可以定义多个PO:PO-1代表交易记录,PO-2代表登录记录,依此类推,直至PO-5代表搜索记录。这些PO分别映射到数据库的不同表。BO,即业务对象,将这些PO整合为一个对象,代表用户的整个行为概览。通过BO,我们可以快速把握相关业务逻辑及其数据结构,简化代码维护。

小结:单个 PO1、PO2、PO3、… 整合为 BO:{PO1、PO2、PO3、… }

三:BO和DTO

虽然BO(业务对象)DTO(数据传输对象)都能组合PO(持久对象)的数据,它们的角色却截然不同。BO封装了业务逻辑,适用于系统内部;DTO则专为数据传输设计,适用于系统间或层级间的数据交换。BO可能包含敏感或冗余信息,不适合直接暴露,而DTO则精选必要数据,确保数据传输的高效和安全。

四:DO

领域对象(DO)是对现实世界业务实体的抽象,通常与数据库中的表结构一一对应。在实践中,DO往往等同于持久对象(PO),通过数据访问对象(DAO)层向上层业务逻辑提供数据。简而言之,DO/PO是数据库表的直接映射,确保数据模型与业务模型的一致性。

一张图看的更直观

其它地方借的图,侵权什么的联系马上删
在这里插入图片描述

总结

分层使用VO(视图对象)、BO(业务对象)、PO(持久对象)、DTO(数据传输对象)在大型团队中有助于清晰界定结构,减少因数据需求不一致而导致的代码冲突。然而,这种分层并非一成不变,应根据业务的复杂性灵活调整。
对于简单业务,甚至可以省略VO,直接使用DTO向前端传输数据。

关键在于团队内部必须对这些概念有统一的理解。如果使用不当,反而可能导致代码混乱。
统一命名规范如下:

  • 数据对象:xxxPO,其中xxx为数据表名(也可使用DO)。
  • 数据传输对象:xxxDTO,其中xxx与业务领域相关。
  • 展示对象:xxxVO,其中xxx通常为网页或视图名称。
  • 业务对象:xxxBO,其中xxx代表具体的业务名称。
  • 明确这些规范有助于提高开发效率和代码可维护性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

记录 Bonobo Git 服务器 SMTP 设置

Bonobo 使用标准的 .NET SMTP 设置&#xff0c;可以在 web.config 中指定这些设置。 <system.net><mailSettings><smtp deliveryMethod"network" from"bonobobonoserver.your.domain"><network host"accessible.smtp.host"…

用一个暑假|用AlGC-stable diffusion 辅助服装设计及展示,让你在同龄人中脱颖而出!

大家好&#xff0c;我是设计师阿威 Stable Diffusion是一款开源AI绘画工具&#xff0c; 用户输入语言指令&#xff0c;即可自动生成各种风格的绘画图片 Stable Diffusion功能强大&#xff0c;生态完整、使用方便。支持大部分视觉模型上传&#xff0c;且可自己定制模型&#x…

AI X HI:塑造数智时代的人类镜像,网易这场分享不能错过!

2001 年&#xff0c;网易正式成立在线游戏事业部。从那以后&#xff0c;网易孵化了许多出圈的精品游戏&#xff0c;跻身成为全球七大游戏公司之一。这些游戏产品之所以能够广受玩家好评&#xff0c;并保持常青&#xff0c;一方面源于十年磨一剑的精良品质&#xff0c;另一方面则…

基于微信小程序的在线点餐系统【前后台+附源码+LW】

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 点餐小程序&#xff0c;主要的模块包括实现管理员&#xff1b;管理员用户&#xff0c;可以对整个系统进行基本的增删改查&#xff0c;系统的日…

一文详解:生产计划和排产管理怎么做?

通过阅读本文&#xff0c;你可以了解以下内容&#xff1a;1、生产计划的制定&#xff1b;2、排产的策略和方法&#xff1b;3、生产计划和排产管理实施&#xff1b;4、生产计划和排产管理的效果评估。 一、生产计划制定 生产计划的本质就是协调企业一切资源“低成本、高质量”…

“RLC串联正弦稳态电路的仿真研究”课程设计,高分资源,匠心制作,下载可用。强烈推荐!!!

1.设计目的 用 Multisim 电路仿真软件&#xff0c;对一个 RLC 串联电路进行正弦稳态电路分析。 2任务分析 2.1任务要求1 在 Multisim 中搭建一个 RLC 串联电路&#xff0c;其中 R、 L、 C、正弦激励源的振幅Vp和频率 f 等所有参数均可自己任意设置&#xff08;不建议都采用…

wordpress建站有哪些优点

对于绝大多数站长来说&#xff0c;使用wordpress建站是一个非常不错的选择。那么wordpress建站有哪些优点呢&#xff1f;下面小编就来为大家解答。 1.wordpress是什么&#xff1f; WordPress是一款全球最受欢迎的内容管理系统&#xff08;CMS&#xff09;&#xff0c;主要用于…

当前的网安行业绝对不是高薪行业

昨天&#xff0c;面试了一个刚毕业两年的同学小A。第一学历为某大专&#xff0c;第二学历为某省地区的本科院校。面试过程表现一般偏下&#xff0c;但动不动就要薪资15K 这个人&#xff0c;我当场就PASS了。主要原因是&#xff0c;并非是否定小A同学的能力&#xff0c;而是他…

小米上架遇到的隐私协议问题

1. 找到【APP权限设置】&#xff0c;点击详情&#xff0c;一一对照&#xff0c;删除没用的&#xff0c;新增小米商家必须要有的内容 2. APP 存在未经用户同意读取“OAID”的行为 uniapp官方文档对应内容处

薄冰英语语法学习--名词2-格

名词后面 s&#xff0c;代表后面这个东西属于前面的。 比如toms book&#xff0c;汤姆的书。 末尾是s&#xff0c;那么直接在最后加就行了。比如boys&#xff0c;男孩们的 表示几个词共同 的所有关系在最后一个词的词尾加 sMary and Toms books 玛丽和汤姆共有的书表示几个词…

商家转账到零钱申请分销返佣场景直接过审方案

分销返佣场景是商家转账到零钱最常见的申请场景&#xff0c;驳回的主要原因是多级分销、代商家收款/二清、充值/消费/转赠等&#xff0c;本文整理了申请的详细步骤&#xff0c;并在最后给出了直接开通的办法。 申请步骤&#xff1a; 1. 确认主体资格&#xff1a;申请的商户号…

个人贷款种类(互联网最全)

作者Toby&#xff0c;来源公众号&#xff1a;Python风控模型&#xff0c;个人贷款种类 个人贷款概述 个人贷款是指个人向银行、金融机构或其他贷款机构借款用于个人消费、投资或其他目的的贷款产品。 个人贷款通常分为 secured loans&#xff08;抵押贷款&#xff09;和 unse…

SpringBoot集成IotDB

1、引入依赖 <dependency><groupId>org.apache.iotdb</groupId><artifactId>iotdb-session</artifactId><version>0.14.0-preview1</version></dependency><dependency><groupId>cn.hutool</groupId><a…

【云原生】加强理解Pod资源控制器

Pod控制器 文章目录 Pod控制器一、Replication Controller&#xff08;RC&#xff09;1.1、什么是RC1.2、RC应用1.3、RC滚动更新 二、Replication Set&#xff08;RS&#xff09;2.1、什么是RS2.2、RS应用 三、Deployment3.1、什么是Deployment3.2、更新节奏和更新逻辑3.3、自定…

安科瑞APM520电能质量分析仪表-安科瑞 蒋静

1 电能质量分析用三相网络电力仪表概述 APM5 系列网络电力仪表&#xff08;以下简称仪表&#xff09;按 IEC 国际标准设计&#xff0c;具有全电量测量、电能统计、电能质 量分析&#xff08;包括谐波、间谐波、闪变&#xff09;、故障录波功能(包括电压暂升暂降中断、冲击电流…

C语言 | 文件操作(下)【必收藏】

文件操作&#xff08;下&#xff09; 5、文件的顺序读写5.1 顺序读写函数介绍5.1.1 fputc与fgetc5.1.2 fputs与fgets5.1.3 fprintf与fscanf5.1.4 fread与fwrite 5.2 对比一组函数 6. 文件的随机读写6.1 fseek6.2 ftell6.3 rewind 7. 文件读取结束的判定7.1 被错误使用的feof 8.…

SD教程:【AI创意】欧洲杯特别设计:SD机甲足球

使用Stable Diffusion&#xff08;SD&#xff09;为欧洲杯设计一款独特的机甲足球。这个创意项目将展示如何结合足球元素和机甲设计&#xff0c;创作出既符合体育精神又具有未来科技感的作品。无论是用于赛事宣传、纪念品设计还是艺术展示&#xff0c;这个设计都能吸引足球迷和…

正则表达式阅读理解

((max|min)\\s*\\([^\\)]*(,[^\\)]*)*\\)|[a-zA-Z][a-zA-Z0-9]*(_[a-zA-Z][a-zA-Z0-9]*)?(\\*||%)?|[0-9](\\.[0-9])?|\\([^\\)]*(,[^\\)]*)*\\))(\\s*[-*/%]\\s*([a-zA-Z][a-zA-Z0-9]*(_[a-zA-Z][a-zA-Z0-9]*)?(\\*||%)?|[0-9](\\.[0-9])?|\\([^\\)]*(,[^\\)]*)*\\)?|(…

论文辅导 | 基于贝叶斯优化-卷积神经网络-双向长短期记忆神经网络的锂电池健康状态评估

辅导文章 模型描述 准确估计电池健康状态是设备稳定运行的关键。针对当前健康状态研究中容量难以直接测量、估计模型调参费时等问题&#xff0c;提出基于多健康特征的贝叶斯优化&#xff08;BO&#xff09;算法优化卷积神经网络&#xff08;CNN&#xff09;与双向长短期记忆&a…

使用 Vanna 生成准确的 SQL 查询:工作原理和性能分析

Vanna工作原理 从本质上讲,Vanna 是一个 Python 包,它使用检索增强功能来帮助您使用 LLM 为数据库生成准确的 SQL 查询。 Vanna 的工作分为两个简单的步骤 - 在您的数据上训练 RAG“模型”,然后提出问题,这些问题将返回可设置为在您的数据库上自动运行的 SQL 查询。 vn.t…