一体多面:哪有什么DO、BO、DTO,只不过是司空见惯的日常

2023-11-20 14:20

本文主要是介绍一体多面:哪有什么DO、BO、DTO,只不过是司空见惯的日常,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

欢迎大家关注公众号「JAVA前线」查看更多精彩分享文章,主要包括源码分析、实际应用、架构思维、职场分享、产品思考等等,同时欢迎大家加我微信「java_front」一起交流学习


1 分层疑问

无论DDD还是MVC模式构建项目,势必涉及到工程结构的分层,每一层由于定位不同,所以访问的对象也不同,那么对象在每一层传递时就会涉及到对象的转换,这时有人会产生以下疑问:

  • 对象种类多,增加理解成本
  • 对象之间转换,增加代码成本
  • 编写代码时有时不同层对象几乎一样

即使有这样的疑问,我也认为分层是必要的,所以本文我们尝试回答上述疑问。


2 通用分层模型

两种通用模型是MVC和DDD,我之前在文章《DDD理论建模与实现全流程》也详细讨论DDD建模和落地全流程,本文只涉及对象的讨论,所以会对模型有所简化。


2.1 模型分类

  • 数据对象:DO(data object)
  • 业务对象:BO(business object)
  • 视图对象:VO(view object)
  • 数据传输对象:DTO(data transfer object)
  • 领域对象:DMO(domain object)
  • 聚合对象:AGG(aggregation)

2.2 MVC

MVC模型总体分为三层:

  • 持久层(persistence)
  • 业务层(business)
  • 表现层(presentation/client)

每一层使用对象:

  • 持久层
    • 输入对象:DO
    • 输出对象:DO
  • 业务层
    • 输入对象:BO
    • 输出对象:BO
  • 表现层
    • 输入对象:VO/DTO
    • 输出对象:VO/DTO

2.3 DDD

DDD模型总体分为四层:

  • 基础设施层(infrastructure)
  • 领域层(domain)
  • 应用层(application)
  • 外部访问层(presentation/client)

每一层使用对象:

  • 基础设施层
    • 输入对象:DO
    • 输出对象:DO
  • 领域层
    • 输入对象:DMO
    • 输出对象:DMO
  • 应用层
    • 输入对象:AGG
    • 输出对象:DTO
  • 外部访问层
    • 输入对象:VO/DTO
    • 输出对象:VO/DTO

3 生活实例

这些对象看起来比较复杂,理解成本很高,好像是为了分层硬造出来的概念。其实不然,这些对象在生活中司空见惯,只不过大家并没有觉察。我们设想有一家三口,小明、小明爸爸和小明妈妈,看看这些对象是怎么应用在生活中的。


3.1 MVC

3.1.1 数据对象(DO)

数据对象作用是直接持久化至数据库,是最本质的一种对象,这就像小明在卧室中穿着背心睡觉,这接近于人最本质的一种状态,小明此时是一种数据对象。


3.1.2 业务对象(BO)

小明起床走出卧室,这时小明就不仅仅是他自己了,他还多了很多身份,例如儿子、学生、足球队队员,不同身份输入和输出信息是不一样的。作为儿子要回应家长的要求,作为学生要回应老师的要求,作为足球队员要回应教练的要求。小明从数据对象,在不同的身份场景中变成了不同的业务对象。


3.1.3 视图对象/数据传输对象(VO/DTO)

小明吃完早饭准备去上学,但是嘴角粘上了饭粒,出门前要把饭粒擦掉。数据传输对象需要注意简洁性和安全新,最重要的是只携带必要信息,而不应该携带不必须要信息,所以此时小明变成了视图对象。


3.2 DDD

3.2.1 领域对象(DMO)

领域对象要做到领域完备,从本质上来说与业务对象相同,但是通常使用充血模型,业务对象通常使用贫血模型。


3.2.2 聚合对象(AGG)

学校要开家长会要求小明、小明妈妈和小明爸爸全部参加,其中小明负责大扫除,小明妈妈负责出黑板报,小明爸爸负责教小朋友们踢足球。此时学校和家长联系时是以家庭为单位的,家庭就是聚合对象。


4 一体多面

通过上述实例我们看到,即使是同一个自然人,在不同的场景下也有不同的身份,不同的身份对他的要求是不同的,输入和输出也是不同的。这就是一体多面。

同理对于同一个对象,即使其在数据库只有一条数据,但是由于场景的不同,输入和输出也是不同的,所以有了各种看似复杂的对象。我们再回看上面三个问题,可以尝试给出本文的答案:

对象种类多,增加理解成本:这是必须要付出的成本,小明不能嘴角挂着饭粒去上学

对象之间转换,增加代码成本:这是必须要付出的成本,不同角色切换时必须要付出切换成本,小明不能用回应足球队教练的输出回应老师或者老师,这是截然不同的角色

编写代码时有时不同层对象属性几乎一样:小明作为一个自然人,他自身固有特性也是相同的,所以表现在对象上是很多属性是一致的。但是不同的角色是有不同要求的,所以为了一些细微的差别,也是要新增对象的,这是必要的代价


欢迎大家关注公众号「JAVA前线」查看更多精彩分享文章,主要包括源码分析、实际应用、架构思维、职场分享、产品思考等等,同时欢迎大家加我微信「java_front」一起交流学习

这篇关于一体多面:哪有什么DO、BO、DTO,只不过是司空见惯的日常的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/395225

相关文章

java中VO PO DTO POJO BO DO对象的应用场景及使用方式

《java中VOPODTOPOJOBODO对象的应用场景及使用方式》文章介绍了Java开发中常用的几种对象类型及其应用场景,包括VO、PO、DTO、POJO、BO和DO等,并通过示例说明了它... 目录Java中VO PO DTO POJO BO DO对象的应用VO (View Object) - 视图对象

Linux常用工具与命令日常记录(长期更新)

Linux常用工具与命令日常记录(长期更新) 目录 1.本地复制到远程2.Linux压缩拆包与解压3.生成随机密码4.ubuntu默认Python版本设置5.计算当前文件夹中文件数量6.windows中编写shell脚本,在Linux运行出错7.history 历史命令显示时间用户8.Ubuntu18.04设置源、网卡9.Ubuntu18.04设置网卡10.Ubuntu:自定义开

Excel和Word日常使用记录:

Excel使用总结 表格颜色填充: 合并单元格: 选中你要合并的单元格区域。按下快捷键 Alt + H,然后松开这些键。再按下 M,接着按 C。这个组合键执行的操作是:Alt + H:打开“主页”选项卡。M:选择“合并单元格”选项。C:执行“合并并居中”操作。 插入行: 在Excel中,插入一行的快捷键是:Windows:选择整行(可以点击行号)。按下 Ctrl + Sh

DTO类实现Serializable接口的重要性

所谓序列化,简单一点理解,就是将对象转换成字节数组,反序列化是将字节数组恢复为对象。凡是要在网络上传输的对象、要写入文件的对象、要保存到数据库中的对象都要进行序列化。Java对象是无法直接保存到文件中,或是存入数据库中的。如果要保存到文件中,或是存入数据库中,就要将对象序列化,即转换为字节数组才能保存到文件中或是数据库中。文件或者数据库中的字节数组拿出来之后要转换为对象才能被我们识别,即反序列化。

笔记本电脑在跑模型或日常使用中突然白屏的解决办法

文章目录 前言解决方案总结 前言 这段时间我注意到在跑模型或是加载一些大文件的时候,电脑经常会突然白屏,这种问题在日常生活中也时常发生,下面会提供快速有效的解决方法,希望能对大家有所帮助。 解决方案 按快捷键 C t r l + A l t + D e l e t e Ctrl + Alt + Delete Ctrl+Alt+Delete 当电脑突然白屏时,不要慌

揭秘循环购模式:如何实现消费增值与日常收益

欢迎各位,我是吴军,你们的电商策略顾问。今天,我将向大家介绍一种新颖的商业模式——循环购模式,它如何为商家和消费者创造价值。 你可能会好奇,为何会有“消费1000元,赠送2000元”的优惠?以及如何实现每日领取现金并能提现?这并非商家在无端送钱,而是循环购模式的魅力所在。 让我们来深入探讨。首先,这种模式结合了消费返利和积分返利的概念,但与市场上一些不稳定的返利计划不同,它通过合理的返

蔚来汽车-测开日常实习-部分手撕代码题

基本上来自牛客的帖子,自己总结了一些题及其做法,之后也会更新其他公司的测开实习真题。 1.    【入门】- 输入十进制整数,输出该整数中1的数量。 感觉比较简单,不知道具体的用例,可能是特别长的输入?这样用字符串处理就行。 如果应规定输入的是long之类的数据类型,就用to_string 转为string类型即可。 int num = 123;std::string str = st

回归预测 | Matlab基于贝叶斯算法优化XGBoost(BO-XGBoost/Bayes-XGBoost)的数据回归预测+交叉验证

回归预测 | Matlab基于贝叶斯算法优化XGBoost(BO-XGBoost/Bayes-XGBoost)的数据回归预测+交叉验证 目录 回归预测 | Matlab基于贝叶斯算法优化XGBoost(BO-XGBoost/Bayes-XGBoost)的数据回归预测+交叉验证效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现基于贝叶斯算法优化X

Flink1.12集成Hive打造自己的批流一体数仓

简介 小编在去年之前分享过参与的实时数据平台的建设,关于实时数仓也进行过分享。客观的说,我们当时做不到批流一体,小编当时的方案是将实时消息数据每隔15分钟文件同步到离线数据平台,然后用同一套SQL代码进行离线入库操作。 但是随着 Flink1.12版本的发布,Flink使用HiveCatalog可以通过批或者流的方式来处理Hive中的表。这就意味着Flink既可以作为Hive的一个批处

【日常记录-Java】SpringBoot中使用无返回值的异步方法

Author:赵志乾Date:2024-09-05Declaration:All Right Reserved!!! 1. 简介         在SpringBoot中,使用@Async注解可以很方便地标记一个方法为异步执行。好处是调用者无需等待这些方法完成便可继续执行其他任务,从而提高应用程序的响应性和吞吐量。 2. 步骤   2.1 启用异步支持         在配置类上添加