DDD的精髓(3)

简介: DDD的精髓(3)

7.3.2 领域驱动


领域驱动设计关心的是业务中的领域划分(战略设计)和领域建模(战术设计),其开发过程不再以数据模型为起点,而是以领域模型为出发点,研发过程如图7-4所示。领域模型对应的是业务实体,在程序中主要表现为类、聚合根和值对象,它更加关注业务语义的显性化表达,而不是数据的存储和数据之间的关系。这是“领域驱动设计”和“数据驱动设计”之间显著的区别。


image.png


仍以上面的CRM为例。假如我们先不考虑数据模型,而是采用面向对象分析(Object Oriented Analysis,OOA)对这个场景进行领域建模,那么可以得到图7-5所示的领域模型。


image.png


可以看到,在图7-5中,领域模型的描述更加贴近业务,一些重要的业务术语和概念没有丢失,更完整地表达了业务语义。即使是产品经理或者业务人员,也不难看懂这样的领域模型,甚至他们可以和技术人员一起参与到梳理领域模型和创建活动中来。


通过DDD的战略设计和战术设计,我们可以为问题域划分出合适的子域,并对域中的业务进行建模。图7-6所示是我们在实际工作中为CRM进行的领域战略设计。


image.png


7.3.3 ORM

很明显,领域模型和数据模型并不是一一对应的关系,但也不排除,有些情况领域模型和数据模型是趋同的,但是大部分情况都需要做一层映射(Mapping)。为了弥补二者之间的差异,行业先驱们做了很多关于映射工作的尝试,这种技术有一个名称叫作对象关系映射(Object Relationship Mapping,ORM),如图7-7所示。



image.png


ORM曾经非常火,记得当年Hibernate才出现时,我用尽了其中的高级技巧,比如继承关系映射、多对多关系映射……结果弄出来的东西却变成了“四不像”,既不像Entity,也不像数据对象(Data Object,DO)。


ORM的问题在于它太理想化,期望通过工具把数据建模和领域建模合一,这样的尝试注定是很难成功的。仍以上述的CRM案例为例,在数据模型中根本就没有私海和公海这两个实体,工具是无法映射的。因此,Hibernate和JPA的衰落是可以预见的。现在使用最多的是MyBatis,它很简单,完全不理会复杂的关系和对象之间的复杂关系映射,只做数据库表和DO之间的简单映射。


复杂的数据库关系和对象关系之间的差异,其本质是数据模型和领域模型之间的差异,而这种差异的多样性和灵活性是很难通过规则预先定义的,这也是为什么工具的作用会很有限。现在的互联网大厂大多使用MyBatis,原因也在于此。因此,如果你打算实践DDD,请一定不要让工具帮你去建模,工具不会抽象,也不会思考,还是要老老实实自己动手去建。


编后语:张建飞说过,他最希望将《代码精进之路》推荐给职场新人看,因为如果在你初入职场的时候,就有一个人教你怎么写好代码,那一定是一件很幸运的事情。


“种一棵树最好的时间是在十年前,其次是现在”。我不相信什么“35岁做不了程序员”,也不相信什么“年纪大了,精力不够”。我只知道有些人在持续学习,有些人过早地享受安逸。


愿你在新的一年可以快乐,也能有所收获。

相关文章
|
微服务 测试技术 Java
阿里技术专家详解 DDD 系列- Domain Primitive
关于DDD的一系列文章,希望能继续在总结前人的基础上发扬光大DDD的思想,但是通过一套我认为合理的代码结构、框架和约束,来降低DDD的实践门槛,提升代码质量、可测试性、安全性、健壮性。
63079 17
阿里技术专家详解 DDD 系列- Domain Primitive
使用使用grafana中文插件
使用使用grafana中文插件
3337 0
使用使用grafana中文插件
|
Java Linux Docker
阿里云云效流水线自动化构建Java项目并发布到docker环境
阿里云云效流水线自动化构建Java项目并发布到docker环境
1611 0
|
机器学习/深度学习 编解码 自然语言处理
YOLOv8改进 | 2023 | CARAFE提高精度的上采样方法(助力细节长点)
YOLOv8改进 | 2023 | CARAFE提高精度的上采样方法(助力细节长点)
1144 2
|
JSON 前端开发 Java
template might not exist or might not be accessible by any of the configured Template Resolvers
template might not exist or might not be accessible by any of the configured Template Resolvers
850 0
|
开发工具 Windows
OpenHarmony 3.2:制作OTA升级包,附脚本及配置
本文介绍了在OpenHarmony 3.2版本中手动制作OTA升级包的详细流程,包括编译镜像、创建OTA文件目录、编写配置文件、运行脚本制作升级包、推送验证以及OTA升级成功的标志和完整打印过程,并提供了一个基于RK3568的简要OTA打包脚本。
860 0
|
安全 前端开发 Java
Spring Security的授权管理器实现
Spring Security的授权管理器涉及用户登录后的token验证和权限检查。当用户携带token访问时,框架会验证token合法性及用户访问权限。自定义授权管理器`TokenAuthorizationManager`需实现`AuthorizationManager<RequestAuthorizationContext>`接口,处理校验逻辑,包括解析token、判断用户角色与访问资源的匹配。配置中在`SecurityConfig`注册该管理器以生效。测试表明,具有不同角色的用户可访问相应权限的资源,否则返回403错误。
543 4
|
数据库 测试技术 Java
阿里技术专家详解DDD系列 第二弹 - 应用架构
应用架构,指软件系统中固定不变的代码结构、设计模式、规范和组件间的通信方式。在应用开发中架构之所以是最重要的第一步,因为一个好的架构能让系统安全、稳定、快速迭代。但是今天我们在做业务研发时,更多会关注一些宏观的架构,而忽略了应用内部的架构设计,希望能通过案例分析和重构,推演出一套高质量的DDD架构。
60186 25
阿里技术专家详解DDD系列 第二弹 - 应用架构
|
XML Android开发 数据格式
Android GB28181接入端实时位置订阅和上报之-如何获取当前经纬度
我们在做Android平台GB28181的时候,其中实时位置(MobilePosition)订阅和上报这块,涉及到实时经纬度的获取,特别是执法记录、车载系统的那个等场景,几乎就是标配。
445 0
|
设计模式 缓存 Java
DDD之代码架构
这是一篇迟到的文章。这其实是我写DDD的第四篇文章。去年11月份左右我在个人网站上写了三篇关于DDD的文章,都是比较偏战略部分的。那个时候我还在一个正在使用DDD的项目上,也是我第一次真正开始深入使用DDD。
935 1

热门文章

最新文章