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岁做不了程序员”,也不相信什么“年纪大了,精力不够”。我只知道有些人在持续学习,有些人过早地享受安逸。


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

相关文章
|
5月前
|
存储 Kubernetes 安全
Docker容器与容器云技术体系全解析:从运行时到编排的选型逻辑
容器不等于Docker,容器云也不等于Kubernetes。完整的容器技术体系覆盖运行时、编排、网络、存储、安全5层,企业选型应按业务阶段和规模逐层匹配,而非一步到位堆满技术栈。
|
7月前
|
安全 JavaScript 数据安全/隐私保护
零基础搞定OpenClaw(小龙虾)Windows部署:最新安装包+全报错解决方案
零基础Windows部署OpenClaw(小龙虾)教程:提供最新一键安装包(v2.6.2),内置Git/Node.js/Python等全部依赖,5–10分钟可视化完成。覆盖杀毒拦截、路径报错、解压失败等全场景解决方案,支持微信/飞书联动、本地运行保安全。
|
Kubernetes 网络协议 调度
Kubernetes权威指南-深入理解Pod & Service
Pod是Kubernetes最小调度单元,将多个紧密协作的容器组合为一个逻辑主机,共享网络、存储与IP。通过YAML定义容器、卷、健康检查等配置,支持静态Pod、Init容器、ConfigMap等高级特性,并借助Service实现稳定的服务发现与负载均衡,Ingress则提供七层流量路由,构建高效、可靠的微服务架构。
1583 3
|
机器学习/深度学习 编解码 自然语言处理
YOLOv8改进 | 2023 | CARAFE提高精度的上采样方法(助力细节长点)
YOLOv8改进 | 2023 | CARAFE提高精度的上采样方法(助力细节长点)
1271 2
|
10月前
|
关系型数据库 MySQL Linux
新手实战指南:Django 项目结构与启动管理
初次接触Django,你是否被它庞大的项目结构劝退?这正是其工程化优势所在。本文将带你从项目创建到服务启停,完整拆解核心文件结构,帮你避开端口占用等常见坑位。学完这篇,你将对Django的整体架构有清晰认知。
|
11月前
|
弹性计算 搜索推荐 应用服务中间件
阿里云服务器租用费用价格表:从入门级配置到企业级高性能收费标准
阿里云服务器优惠汇总:轻量应用服务器200M带宽38元/年起,ECS云服务器2核2G 99元/年,2核4G 199元/年,4核16G 89元/月,8核32G 160元/月,香港轻量25元/月起,GPU服务器低至1681元/月,新老用户同享,续费同价,限时秒杀,配置丰富,适合个人与企业多种应用场景。
1986 4
|
10月前
|
存储 安全 数据处理
【需求:GDPR合规下做地域定向】解决方案:仅用IP离线库输出国家码,不存原始IP?
在GDPR合规要求下,技术部通过IP离线库实现“仅输出国家码、不存原始IP”的地域定向方案。该方案确保IP仅作瞬时输入,本地解析后不留存,符合数据最小化原则。相比在线API,离线库避免第三方数据共享,边界清晰,合规可解释性强,且性能稳定,适合高并发场景。结合严格日志管控与工程实践,此方案在保障业务需求的同时,有效降低合规风险,为海外业务提供安全可控的基础支持。
|
10月前
|
数据采集
静态IP个人用户如何选择?
静态IP助力远程办公、海外学习等场景,但个人用户易陷低价陷阱。本文教你按需选择,避开脏IP、地域虚假、售后缺失等坑,聚焦纯度、真实性和服务保障,选对高性价比、合规可靠的静态IP方案。
|
11月前
|
运维 搜索推荐 数据安全/隐私保护
Dataphin功能Tips系列(81)自定义项目角色,实现生产数据零越权
在Dataphin中,管理员可通过克隆并自定义“运维”角色,取消其对生产表的操作权限,以满足企业对数据安全的管控需求。通过角色克隆、权限调整与重新分配,实现精细化权限管理,保障生产环境数据安全,同时兼顾团队协作效率。
216 0

热门文章

最新文章