阿里java开发手册中命名规约解读之DO/BO/DTO/VO/AO
前言
在阅读《阿里巴巴Java开发手册》时,看到命名规则中有这样一条

虽然知道这些是根据Java对象的角色所分配名称的后缀,但是没有弄清楚分别是什么意思,日常开发中也没有使用到。
网上查找了一些资料,但是感觉大多数都是一样的,可能大家都是互相copy,篇幅过长并且不易理解。
别灰心!《阿里巴巴Java开发手册》中对于上面这些在领域模型的命名使用上给出了规范,说的很清楚,分享给大家。
领域模型命名规约
1.数据对象:xxxDO,xxx即为数据表名;
2.数据传输对象:xxxDTO,xxx为业务领域相关的名称;
3.展示对象:xxxVO,xxx一般为网页的名称;
4.POJO 是DO/DTO/BO/VO的统称,禁止命名成xxxPOJO。
个人解读
1.如果你写的web应用是一个CRUD的demo,那么一个DO就完全够用。
例如,写一个用户的增删改查,数据库中有一个user表,你建立一个UserDO,类中的字段和数据库中一致,当你需要对User操作时,就用UserDO进行数据存取。
那么问题来啦:
首先,例如user表中有一个叫做passWord的字段,保存了登录密码,这个字段肯定是不需要返回到页面上的,但是如果像上面的操作,直接把UserDO的对象返回给前台,必然会带来安全隐患;
其次,如果User中有些字段需要转换后才能正确显示(例如显示中文,保存的是英文,或者保存的是关联表中的id),直接返回UserDO就只能在页面上用js写if...else...来区分值,很繁琐;
最后,如果你的页面上显示的数据是一个很大的结果集(调用了好几个接口的返回结果),例如除了User信息还有Account信息,一个UserDO显然就不够用了;
VO的概念应运而生。
2.VO中我们写的字段都是前台所需要的,而不是对象的所有字段值;
VO中的字段格式都是符合前台页面显示所需的,需要中文就显示中文;
对于调用了好几个接口返回的结果集,可以封装一个VO,将所有结果整合后再返回给前端页面。
3.有些人肯定在想,我的DO和VO中字段大多数都是相同的,有必要再写这样一个类吗?
答案是有的!如果写的是比较小的web应用,字段不多,你觉得没有这个必要。但是如果写的是大一些的系统,字段越多,分层的优势就会越明显。(博主写的web不大,但是拿出一个类也是一百多个字段,深感头疼)
DO和VO之间的转换
1.两个POJO之间的属性值进行copy,最原始的方法就是手动复制,但是这样就会产生大量的set,get代码,业务逻辑才是重点好吗?!不能喧宾夺主;
2.还有种方法就是用Spring提供的BeanUtils,博主现在的项目中用的就是这个,感觉还可以,但是也有点小问题,例如copy日期需要先注册等;
3.使用Dozer。Dozer是一个对象转换工具,可以在两个JavaBean之间进行递归数据复制,并且这些JavaBean可以是不同的复杂的类型。有兴趣的同学可以去学习下。
阿里java开发手册中命名规约解读之DO/BO/DTO/VO/AO的更多相关文章
- 阅读阿里Java开发手册记录
概述 在阅读完阿里Java开发手册(嵩山版)后,发现自己在开发过程中有一些没有按照规范开发的情况,这里将容易忘记的规范记录下来,并且添加自己的理解,一方面方便自己巩固记忆,另一方面希望对其他同学能够提 ...
- 阿里Java开发手册1.3.0 文字版
版本: 1.3.0 update: 2017.9.25 一.编程规约 (一) 命名风格 1. [强制]代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束. 反例:_name _na ...
- 为什么阿里巴巴Java开发手册中强制要求整型包装类对象值用 equals 方法比较?
在阅读<阿里巴巴Java开发手册>时,发现有一条关于整型包装类对象之间值比较的规约,具体内容如下: 这条建议非常值得大家关注, 而且该问题在 Java 面试中十分常见. 还需要思考以下几个 ...
- 阿里JAVA开发手册零度的思考理解(一)
转载请注明原创出处,谢谢! 缘由 阿里JAVA开发手册已经发表有很长时间了,值得认真研究思考推广 阿里官方的Java代码规范标准,这份开发手册不仅规范了一些开发细节,也提出了很多工程开发的哲学,值得好 ...
- 阿里JAVA开发手册零度的思考理解(二)
转载请注明原创出处,谢谢! 说在前面 人生的大道上默默地走,就必须要有一盏灯亮着为你引导方向!而这盏灯抑或只是一句话,一句鼓励,一个赞美,一次承认,一次认可,一次相识一次交流-- 上篇文章:阿里JAV ...
- 【转】线程池体系介绍及从阿里Java开发手册学习线程池的正确创建方法
jdk1.7中java.util.concurrent.Executor线程池体系介绍 java.util.concurrent.Executor : 负责线程的使用与调度的根接口 |–Execut ...
- Java开发手册之编程规约
时隔一年多,再次开始更新博客,各位粉丝们久等了.大家是不是以为我像大多数开发者一样三分钟热度,坚持了一年半载就放弃了,其实不是.在过去的一年时间我学习了<Java编程思想>这本书,因为都是 ...
- 品阿里 Java 开发手册有感
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 一个优秀的工程师和一个普通的工程师的区别,不是满天飞的架构图, ...
- 为什么阿里巴巴Java开发手册中不允许魔法值出现在代码中?
在阅读<阿里巴巴Java开发手册>时,发现有一条关于关于常量定义的规约,具体内容如下: 图中的反例是将数据缓存起来,并使用魔法值加链路 id 组成 key,这就可能会出现其他开发人员在复制 ...
随机推荐
- 基于JerseyToken安全设计
网上Jersey中文资料不多,更别提其他了.本人跟进项目具体需求弄了简单的api认证机制 基本流程图 后端登录退出代码: @Path("Account") public class ...
- django 项目中遇到的问题(持续更新中)
问题1:in include 'provide the namespace argument to include() instead 描述:在最外层的urls.py 添加项目的urls后报错,错误显 ...
- javascript 执行环境细节分析、原理-12
前言 前面几篇说了执行环境相关的概念,本篇在次回顾下 执行环境(Execution context,简称EC,也称执行上下文 ) 定义了变量或者函数有权访问的数据,决定了各自行为,每个执行环境都有一个 ...
- webpack基础打包安装分享
一.创建webpack-first文件夹作为站点,创建app文件夹存放js原始模块(main.js 和 Greeter.js) 创建 public文件夹存放index.html和打包后的bundle. ...
- jdbc+servlet+jsp实现登录验证
基础知识准备:sql的增删改查. 新增:insert into 表名称(字段名.....)values(字段名....). 修改:update 表名称 set 字段名="新值" ...
- 用json方法来作深拷贝应该知道的一点东西!
之前写js比较多的的时候也写过深拷贝,浅拷贝,继承啥的,还有自定义的监听事件.然而过了很久都忘了. 最近在项目上用的深拷贝都是 b = JSON.parse( JSON.stringify(a) ) ...
- JavaScript判断对象类型及节点类型、节点名称和节点值
一.JavaScript判断对象类型 1.可以使用typeof函数判断对象类型 function checkObject1(){ var str="str"; console.lo ...
- Codeforces 834E The Bakery【枚举+数位dp】
E. Ever-Hungry Krakozyabra time limit per test:1 second memory limit per test:256 megabytes input:st ...
- vim与外部文件的粘帖复制
vim与外部文件的粘帖复制 ubuntu默认vim是不支持从外部文件与vim之间的粘帖复制,vim有自己的剪切版,分别是”0-”9,”-,”8,”+,”:,”/,”%,”i,这些都是vim的寄存器,可 ...
- C#的LINQ
在过去如果我们如果需要去查询某些集合或者数组里面的某些元素,我们需要写出大量的带有筛选的遍历集合的代码,但是有了Linq之后,我们就不用写出那些冗余麻烦的遍历代码,只需要关注其中的筛选,排列的函数就可 ...