DO,DTO,VO,POJO 你知道吗?
作为后端最常用的编程语言之一,Java 已经有很多年的历史了,在阿里内部,Java 也是使用最广泛的一门语言。在阿里实习的这段时间,规范一词是我感受最深的。没有规矩不成方圆,今天来说一下 Java 中的各种 O(bject)。
为什么会出现这些 O?
我们知道,这些 O 不管叫什么名字,其本质都还是对象(Object),既然本质都一样,为什么非要给他们套上各种马甲?个人认为原因有三:第一,随着编程工业化的发展,需要有一套合理的体系出现。中国人喜欢造神,外国人喜欢造概念,于是 MVC、MVP、MVVM 等编程模型就出现了,为了搭配这些编程模型的使用,需要对 Object 的功能进行划分,于是我们便看到了这些层出不穷的 Object。当然这里并没有批评这些概念的意思。其二,我认为在团队协作编码中,一个好的命名方式是可以节约很多时间成本的。就比如getItemById
一眼看去就知道是通过 id 获取一个 item 对象,ItemVO
一眼看去就知道是前端透出的 json 对应的对象。其三,如此划分,可以让项目结构更加清楚,不至于出现东一块西一块,对象乱扔的局面。尽可能避免了在多人协作时对象混乱的情况。总的来说,这一切都是为了让软件编程更加合理、更加规范、更加高效。
有哪些 O?
这些 O 有很多衍生出的命名,比如 VO、DO、BO,这里我们把常见的 O 列举出来,然后一一解释。
以下内容参考阿里巴巴 Java 开发手册,如果有需要可以在微信公众号「01 二进制」后台回复「Java 开发手册」获得。
•DO( Data Object):与数据库表结构一一对应,通过 DAO 层向上传输数据源对象。•PO(Persistant Object):持久对象,一个 PO 的数据结构对应着库中表的结构,表中的一条记录就是一个 PO 对象•DTO( Data Transfer Object):数据传输对象,Service 或 Manager 向外传输的对象。•BO( Business Object):业务对象。由 Service 层输出的封装业务逻辑的对象。•AO( Application Object):应用对象。在 Web 层与 Service 层之间抽象的复用对象模型,极为贴近展示层,复用度不高。•VO( View Object):显示层对象,通常是 Web 向模板渲染引擎层传输的对象。•POJO( Plain Ordinary Java Object):POJO 专指只有 setter/getter/toString 的简单类,包括 DO/DTO/BO/VO 等。•DAO(Data Access Objects):数据访问对象,和上面那些 O 不同的是,其功能是用于进行数据操作的。通常不会用于描述数据实体。
一下子给出 8 个常见的 O,光看解释大家可能会有些迷糊,接下来我们从下面这张图入手,带大家直观的感受下,这些 O 的用处。
数据的流向
我们知道,一般情况下,前端是不会凭空造出数据的,因此最后前端展示的数据一定是从数据库中来的,数据的流向通常也是从数据库流向页面。我将其分成三个部分:数据访问、业务处理和业务解释。
1.数据访问:这一部分是用于从数据库中读取数据,将数据记录转换成数据实体也就是 Java 对象,便于操作。2.业务处理:这一部分是数据流的核心,几乎所有数据的操作都是在这一部分完成的。3.业务解释:这一部分是用于展示给前端的数据,解释业务体现在某些字段/值是需要经过处理的才会呈现的。
关键点
说了这么多,我们整理出以下关键点。
•DAO,是用于操作数据而不是描述数据的。•PO/DO/Entity,其数据结构对应数据表中的一条记录,因此是同一类别的。•BO,可以理解为 PO 的组合,举个简单的例子,假设 PO 是一条交易记录,BO 就可以是一个人全部的交易记录集合对象。•DTO,用于传输数据,可能传递给前端,也有可能传递给其他系统。用于承载数据。•VO,这个最好理解,前端最后需要的数据长什么样,对应的对象就是 VO。
如何使用这些 O?
说了这么多,在实际的项目中,我们应该如何去使用这些 O?
教条主义?
首先,这几个概念很完整,但是我们在用的时候是必须按这个来做吗?答案当然不是的,规矩是死的,人是活的。文章开头我们就说了,之所以引入这些概念,很大程度上是为了提升编程体验,而且系统和系统的复杂度不同,协作水平不同,完全没有必要教条主义,适合自己的才是最好的。
省略方案
1.不管你是叫 PO 还是 DO 还是 Entity,用于描述数据库记录的对象一定要存在,不可省略。2.DTO 和 BO 在一般情况下,如果业务系统不是非常复杂,可以考虑省略。3.VO 和 DTO,DTO 可以用于将数据传递给前端,如果你不需要删减字段的话,VO 可以考虑省略。
注意事项
领域模型命名规约:
•数据对象:xxxDO,xxx 即为数据表名。•数据传输对象:xxxDTO,xxx 为业务领域相关的名称。•展示对象:xxxVO,xxx 一般为网页名称。•POJO 是 DO/DTO/BO/VO 的统称,禁止命名成 xxxPOJO。
最后
以上就是本篇文章的全部内容了,如果你觉得本篇文章对你有所帮助,不妨关注支持一下。
本文分享自微信公众号 - 01二进制(gh_d1999add1857)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
给Twitter设计个安全修复方案
不要神化国外的安全建设 Twitter的苦衷 要解决的问题 设计安全方案的原则 访问控制架构 注意事项 不要神化国外的安全建设 安全做的不差的NetFlix(参考Netflix的DevSecOps最佳实践),因为财报不理想最近股价大跌,Twitter有高危漏洞但是股价并未受影响,更加说明了笔者的论断:企业业务发展远比安全风险给股价带来的长期影响重要..... 此类漏洞举一反三TSRC(参考企业安全建设 丨 当我们在谈论推特安全事件时,我们在谈论什么?)给出的解决办法是一、内部系统需要零信任;二、权限类收敛采用框架集成全链路票据,数据操作层集中验票的,想来在腾讯完全落地有难度,也不能让Twitter快速解决问题。笔者看到Twitter内部这么久还没闭环,作为美国股市精神股东真替他们捉急。:) 根据最新的媒体报告,Twitter认为此次漏洞原因是”公司检测到了一次协同式社交工程攻击,发动者成功锁定了一些具有访问内部系统和工具权限的Twitter员工。黑客利用这些访问权限控制了许多知名账号和密码,之后便使用其账号发布关于比特币的动态。“,属于内部的人为失误\蓄意破坏\信息窃取这一类风险。上一...
- 下一篇
内核级木马与病毒攻防:Linux可执行文件的ELF格式描述
要想在Linux系统上实现逆向工程,分析,设计或查杀病毒和恶意代码,你不得不深入掌握其可执行文件的ELF格式,这样你才能了解进程在内存空间的布局和运行的基本规律,这样你才能有针对性的设计有效的病毒或恶意代码入侵系统。 ELF文件主要有以下几种类型,ET_NONE表示该文件的作用未知;ET_REL表示重定向文件或叫目标文件,它们将会被链接并加装到某个指定的虚拟内存位置,常见的以.o结尾的二进制文件就属于这种类型。ET_EXEC表示可执行文件,它是由多个.o文件链接起来,可以被加载到内存进行执行的进程数据文件;ET_DYN表示动态链接库,它里面包含一系列向外导出的函数代码,当进程需要调用其内部函数时会将其加载到内存;最后一种是ET_CORE,它是进程奔溃时产生的二进制信息文件,通过GDB加载该文件可以查找进程奔溃的原因。 ELF文件的头部结构能反映出该文件很多重要信息,使用readelf -h可以读取指定ELF文件的文件头,其使用示例如下:其二进制数据结构如下: #define EI_NIDENT 16typedef struct { unsigned char e_ident[EI_NI...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8安装Docker,最新的服务器搭配容器使用
- 设置Eclipse缩进为4个空格,增强代码规范
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS7安装Docker,走上虚拟化容器引擎之路