一分钟搞懂 DDD

简介: 一分钟搞懂 DDD

领域驱动设计的提出已经有将近 20 年的历史,在最近几年微服务兴起之后,人们发现领域驱动设计天然适配微服务架构,因此吸引了大量的关注。这篇文章以非常简洁的笔触介绍了 DDD 涉及到的一些概念定义,可以快速的建立起领域设计的基本概念。原文:DDD in a nutshell[1]


你可能已经听很多人谈论过 DDD,DDD 是领域驱动设计(Domain-Driven Design)的简称,有人把它想象成一种巨大而神奇的东西,但实际上它只是一组包含了许多组合模式和最佳实践的方法,帮助我们构建更好的软件。


领域驱动设计是指软件代码的结构和语言应该与业务领域相匹配的概念。例如,如果一个软件处理贷款申请,它可能有像 LoanApplication 和 Customer 这样的类,以及像 AcceptOffer 和 Withdraw 这样的方法。——维基百科[2]


有许多著名的书籍是关于领域驱动设计的,比如 Eric Evans 在 2003 年出版的《领域驱动设计——软件核心复杂性应对之道》[3]。但在本文中,我希望能以简单的方式帮助你理解 DDD 的全貌,后续你可以通过阅读相关书籍了解更多详细信息。


总体来说,关于 DDD 的讨论主要是关于战略和战术模式:

  • 战略模式帮助你设计领域和子领域,利用通用语言进行交流,根据输出的结果支持团队的组织架构。
  • 战术模式指导你如何以可伸缩的方式实现应用程序。

image.png


DDD 简介


战略设计(Strategic Design)


image.png


战略模式可以帮助你设计领域和子领域,这些领域通过通用语言进行交流,支持你根据结果组织/构建你的团队。


首先,需要定义通用语言,这将帮助团队就相同的术语达成一致,从而带来对定义或业务的相同理解。我想强调的是,这是必要步骤,应该在一开始就做,并在开发期间继续下去。


有界上下文帮助你定义主领域和子领域以及它们之间(上游和下游)的依赖关系。然后在此基础上,可以根据组件或服务来构造应用程序。最后,将团队组织起来,负责构建和维护这些服务。


战术设计(Tactical Design)


战术模式指导你如何以可伸缩的方式实现应用程序。


image.png


战术设计帮助基于构建块创建优雅的领域模型,参见下面的主要构建块:


聚合(Aggregates)


聚合是战术设计中最重要、最复杂的模式之一,聚合基于另外两种战术标准(Tactical Standards),即实体(Entities)值对象(Value Objects)聚合是一个或多个实体的集群,也可能包含值对象,集群的父实体被称为聚合根(Aggregate Root)

(thedomaindrivendesign.io)

例如,在电子商务领域,你也许会定义一个命名为 Order 的聚合,包含 Address(值对象)和 Consumer(实体)。


实体(Entities)


实体是具有惟一标识符的潜在可变对象,在其域模型中有自己的生命周期,从而我们能够获得该实体完整状态转换历史。


值对象(Value Objects)


值对象实体的区别在于值对象是不可变的,并且没有唯一的标识,仅由其属性的值所定义。这种不变性造成的结果是,为了更新值对象,必须创建新实例来替换旧实例。


服务(Services)


服务是执行某些逻辑的无状态对象,这些逻辑不适合在单一的实体值对象上进行操作。


服务执行特定于域的操作,可能会涉及多个域对象。


仓库(Repositories)


仓库主要用于处理存储,抽象了对数据存储的关注,负责持久化聚合


工程(Factories)


工厂用于在对象的构造中提供抽象,并返回聚合根实体值对象工厂可以替代构造函数构建复杂的对象。


事件(Events)


事件表明领域中已经发生的重大事件,需要向属于该领域的其他利益相关者报告。通常聚合会负责发布事件。


组件(Modules)


开发人员很少提及组件,但是,使用组件可能会非常有趣。


组件帮助我们分离概念,可以根据不同的编程语言将其定义为包(package)命名空间(namespace),并且始终遵循通用语言(Ubiquitous Language)


结合以上构建块,战术设计还提供了许多有价值的模式,如 CQRS、事件源(Event Sourcing)、分层架构(Layered Architecture)……,这些模式可以帮助我们构建易于维护和扩展的更好的系统。


References:

[1] https://tech.tamara.co/ddd-in-a-nutshell-3852b0a6155a

[2] https://en.wikipedia.org/wiki/Domain-driven_design

[3] https://book.douban.com/subject/5344973/

目录
相关文章
|
1月前
|
存储 消息中间件 JSON
|
4月前
|
消息中间件 测试技术 领域建模
DDD - 一文读懂DDD领域驱动设计
DDD - 一文读懂DDD领域驱动设计
7529 2
|
4月前
|
消息中间件 JavaScript Kafka
谈谈代码:DDD从入门到完全入门
之前的DDD文章——谈谈代码:降低复杂度,从放弃三层架构到DDD入门,通篇下来像 是简单的讲了一些概念,然后快速的实战一下——很多同学反馈感觉就是入门了,但没有完全入门,因此我们再加一篇。
241 3
谈谈代码:DDD从入门到完全入门
|
消息中间件 开发者
DDD领域驱动设计实战(六)-领域服务(上)
DDD领域驱动设计实战(六)-领域服务
435 0
DDD领域驱动设计实战(六)-领域服务(上)
|
前端开发 架构师 Java
领域驱动设计DDD从入门到代码实践
在本文中,作者将借鉴《实现领域驱动设计》的做法,介绍领域驱动设计的基本概念的同时,用一个虚拟的公司和一个虚拟的项目,把领域驱动设计进行落地实践。
12913 9
领域驱动设计DDD从入门到代码实践
|
消息中间件 架构师 搜索推荐
DDD领域驱动设计的概念解析
DDD领域驱动设计的概念解析
217 0
|
前端开发 JavaScript NoSQL
DDD实战之二:看看代码结构长啥样
DDD实战之二:看看代码结构长啥样
DDD实战之二:看看代码结构长啥样
|
Java 测试技术 数据库
|
设计模式 SQL 开发框架
DDD开篇
从知道DDD到现在已经很多年了,看了不少理论知识,在项目中也使用了DDD,碰到些问题,也有些思考,整理一下,上升一下,形成一种适合自身的方法论 在回顾过程中,首先追根溯源,什么是DDD?为什么要使用DDD?如何给别人阐述这些最基本的概念与理念,真是个难题
234 0
DDD开篇
|
自然语言处理 安全 架构师
DDD开篇总结
之前写了两篇《DDD开篇》[1]与《DDD应对复杂》[2],是时候总结一下了 对于DDD的启蒙,不管是国内还是国外思维逻辑都是一样的。或者说如果你想写本关于DDD的书,大纲似乎是一样的 首先DDD是什么?给出定义,定义有些抽象,难以一次性接受,那就通过以往问题引出DDD,这时模型、复杂度、开发流程都是自然附带出的概念,再后面就是DDD的知识结构是什么,最后就是讲解一个实例,也有些会把实例穿插到各个篇章中
201 0
DDD开篇总结