简述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代表具体的业务名称。
  • 明确这些规范有助于提高开发效率和代码可维护性。

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

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

相关文章

公益培训|半导体与集成电路项目制培训项目

关于我们 硬蛋产业学院,基于硬蛋创新(http://00400.HK)在芯片产业的资源和技术优势,引进全球领先的芯片应用技术,为国内培养芯片应用技术人才,助力芯片应用产业发展。 硬蛋产业学院在国家各主管部门、广东省、深圳市及社会各界的大…

AI 激发算力需求暴增,施耐德电气解码智算中心发展

随着全球碳达峰目标的持续推进,各行各业都在加速绿色转型的步伐,尤其是高耗能产业更是备受关注。人工智能行业以其迅猛的发展速度令人瞩目,它所带来的不仅是算力需求的飙升,更是日益凸显的能耗问题。 目前,人工智能预…

AVI 是什么格式,AVI 格式用什么播放器打开?

AVI 是什么格式?提到 AVI 格式想必大家多数会想到在 DVD 横行的年代,光盘中所包含的媒体视频格式多是以 AVI 格式存储。AVI 是一个非常通用的容器格式,支持多种视频和音频编解码器。这意味着从DVD中提取视频内容时,可以通过转码为…

发电机保护屏产品介绍,组成

发电机保护屏产品介绍,组成 发电机保护屏是用于保护发电机组的电气装置。它根据发电机的类型和实际运行要求,将多种保护装置组合在一起,形成一个保护屏柜。发电机保护测控屏是指把发电机类保护装置集中在安装在一个控制柜里,主要用…

Java程序递归及mybatis递归查询

之前项目组有个需求,定时同步机构的信息。已知三方接口由于返回数据量很大,所以最后需要三方提供一个可根据机构编号获取当前机构及子机构信息的接口。而不是一次性返回全部机构信息! 由于这次需求也用到了递归,所以记录下&#…

Python自动化操作:简单、有趣、高效!解放你的工作流程!

今天跟大家分享一套自动化操作流程解决方案,基于Python语言,涉及pyautogui、pyperclip、pythoncom、win32com依赖包。安装命令为: pip install pyautoguipip install pyperclippip install pythoncompip install win32compyautogui 是一个自…

病理性不对称引导的渐进学习用于急性缺血性脑卒中梗死分割| 文献速递-先进深度学习疾病诊断

Title 题目 Pathological Asymmetry-Guided Progressive Learning for Acute Ischemic Stroke Infarct Segmentation 病理性不对称引导的渐进学习用于急性缺血性脑卒中梗死分割 01 文献速递介绍 中风已经成为第二大致命疾病,大约70%的中风是缺血性的。众所周知…

如何提高网页加载速度?

如何以闪电般的速度加载网站? 看看这 8 个提升前端性能的技巧: 01 压缩 在传输之前压缩文件可以减少其大小,减少需要传输的数据量,从而加快加载时间。 实现方法: Gzip/Brotli 压缩: 配置你的 web 服务器&#xff08…

[Linux] 历史根源

UNIX系统: 1969年,由贝尔实验室的K.Thompson和D.M.Ritchie为PDP-7机器编写的一个分时操作系统, 最初使用汇编语言编写, 后来1972年C语言出世以后,二人由使用C写了UNIX3, 此后UNIX大为流行开来 UNIX流派树&a…

华为交换机的堆叠-Stack配置(基于业务口普通线缆的堆叠配置)

不想看原理请跳过一、二、三、四, 直接到配置五,干完活有时间在慢慢看原理。 一、什么是堆叠-Stack 指将多台交换机通过堆叠线缆连接在一起,逻辑上变成一台交换设备,作为一个整体参与数据转发。即:1 1 一 二、堆叠…

如何通过待办工具提升个人效率 减轻压力提升效率的待办app

在快节奏的现代社会中,工作任务繁重,人们的压力日益增大。为了减轻压力并提升工作效率,我们急需找到一种有效的方法来管理日常任务。幸运的是,随着科技的进步,各种新兴工具应运而生,为我们提供了便捷的解决…

qt报错:“QtRunWork”任务返回了 false,但未记录错误。

qt报错:“QtRunWork”任务返回了 false,但未记录错误。 说明情况一 说明 这个报错可能的原因有很多,这里只写一种,以后遇到再进行补充。 情况一 如果 Q_OBJECT 宏未正确处理,通常会出现类似的错误。 要使用信号与槽…

3.优化算法之二分查找1

二分查找简介 1.特点 最简单最恶心,细节最多,最容易写出死循环的算法 2.学习中的侧重点 1)算法原理 数组有序的情况 2) 模板 不要死记硬背 ->理解之后再记忆 1.朴素的二分模板 2.查找左边界的二分模板 3.查找右边界的二分模板 …

24年了 直播带货的未来如何?

32 个国家在取消电商, 那我国的电商呢,首先电商是不会被取缔的。直播电商会被严格的控制,比如有一家饼店,它线下的销售是 3000 万,线上抖音的销售是 5, 000 万。 这一类型小而精又专业的品牌企业,未来在抖…

Sensei for Mac:一键清理,系统如新!

Sensei for Mac是一款高效且易于使用的系统优化清理工具。它能够深入Mac系统内部,智能识别并清理无用的缓存文件、临时文件、垃圾邮件等,从而释放磁盘空间,提升系统性能。无论是日常使用还是长时间工作后,Sensei都能帮助你的Mac恢…

鸿蒙 HarmonyOS NEXT星河版APP应用开发阶段三-热门组件使用及案例

一、样式和结果重用 介绍 /* Extend:扩展组件(样式、事件) Styles: 抽取通用数据、事件 Builder:自定义构建函数(结构、样式、事件) */Extend /* 作用:扩展组件(样式、事件) 场景:…

封装图片占位图组件

<laze-image class="image" :url="item.image" :game_name="item.game_name" :placeholder="require(@/static/images/common/placeholder.png)"></laze-image> 1.通过调用组件实现 先加载预览图片,再加载真实的图片 2…

中国杀出全球首个烹饪大模型

什么&#xff1f;烹饪也有大模型&#xff1f;&#xff01; 没有听错&#xff0c;这就是国产厨电龙头老板电器最新发布——“食神”大模型。 数十亿级行业数据&#xff0c;数千万级知识图谱加持&#xff0c;据称还是全球首个。 它能为每个人提供个性化量身定制的解决方案&…

TikTok短视频矩阵系统

随着数字化时代的到来&#xff0c;短视频已成为人们获取信息、娱乐消遣的重要渠道。TikTok&#xff0c;作为全球最受欢迎的短视频平台之一&#xff0c;其背后的短视频矩阵系统是支撑其成功的关键因素。本文将深入探讨TikTok短视频矩阵系统的构成、功能以及它在新媒体时代中的影…

什么领夹麦的音质最好又降噪?揭秘多款降噪出色的无线领夹麦克风

随着短视频的兴起&#xff0c;将视频拍摄方面的外设推到了风口浪尖上&#xff0c;麦克风作为视频拍摄或者现场直播使用的主要拾音工具&#xff0c;自然成为了大家非常关注的一个摄影外设工具&#xff0c;毕竟一款好的拾音工具能够给视频创作者或者直播博主带来更好的使用体验。…