《解构领域驱动设计》- 领域驱动设计统一过程

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

更多内容关注微信公众号:fullstack888

领域驱动设计的核心是模型驱动设计,而模型驱动设计的核心又是领域模型,领域模型必须在统一语言的指导下获得。领域模型又可进一步细分为核心子领域、通用子领域和支撑子域。

3814d383c1e6f4be07393d748159168d.jpeg

系统上下文、限界上下文、分层架构和聚合都属于领域驱动设计的边界控制手段,他们的区别在于对业务划分的粒度和维度不同。

领域驱动设计统一过程

“人类是通过在问题空间中寻找解决方案来解决问题的”

同理,软件系统的构建实则是对问题空间的求解,以获得构成解空间的设计方案。

问题空间强调通过统一语言来描述需求问题,利用核心子领域、通用子领域和支撑子领域来分解问题空间。

解空间中,这些子领域将被映射到限界上下文,可以根据子领域类型的不同为限界上下文选择不同的建模方式。比如核心子领域可以选用领域建模,而支撑子领域的限界上下文可以选择事务脚本模式

注意:由此可见,子领域是问题空间中的概念,在拆分问题时,对问题进行分级;限界上下文是解空间中的概念,它跟问题空间中的子领域具有映射关系,可以基于子领域推导出限界上下文来

在限界上下文中要通过分层架构将领域模型独立出来,其目的是实现关注点分离,比如通过分层架构将技术与业务分离,保持两者的变化仅在其所在的层次内传递,防止两者复杂度的交织引发的更大范围的复杂度。

领域驱动设计战略设计阶段的核心模式是限界上下文,指导架构设计的核心模式是分层架构,前者决定了业务架构和应用架构,后者决定了技术架构。

领域驱动设计的核心诉求是让业务架构和应用架构形成绑定关系,同时降低与技术架构的耦合,使得在面对需求变化时,应用架构能够适应业务架构的调整,并隔离业务复杂度与技术复杂度,满足架构的演进性。

完整的领域驱动设计过程划分为三个重要的阶段:

1)全局分析阶段:对现实世界中问题的分析

2)架构映射阶段:解决现实世界与软件解决方案的桥接问题

3)领域建模阶段:对软件解决方案内部进行进一步的分析建模

895e3b720d6cac6a9dc46657b4d68879.jpeg

全局分析阶段

目标:通过可视化的手段完成对问题空间的探索与分析

任务:通过执行价值需求分析和业务需求分析活动,深入剖析问题空间

活动:价值需求分析、业务需求分析

产物:全局分析规格说明书

价值需求分析
价值需求分析

利益相关者、系统愿景和系统范围共同组成了目标系统的价值需求,分属于 5W 模型中的 Who、Why 和 Where。

  • 首先需要识别出目标系统的利益相关者(Who)

  • 然后通过统一利益相关者的业务目标,明确目标系统的界限和方向

  • 最终做到明确系统愿景(Why)和识别系统范围(Where)

eef6e522f8c7766341fc7f250faf66f4.jpeg

模式:统一语言

方法:商业模式画布

利益相关者

0ffcf073bf0f335e5719c0b40dc0c395.jpeg

支持者,比如组织、部门、员工和上游第三方合作伙伴

受益者,比如用户、下游第三方

注:上游指的是提供价值方,下游指消费价值方。

业务需求分析

价值需求分析指导业务需求分析。

业务需求由动态业务流程和静态的业务场景、业务服务组成,两者的结合依靠业务场景按照时间点和业务目标对业务流程进行拆分。

业务需求分析阶段可分三个层级对业务需求进行逐级的问题拆解,如下。完成问题拆解后,即可梳理出核心子领域、通用子领域和支撑子领域。

  • 第一层:业务流程

  • 第二层:业务场景

  • 第三层:业务服务

8e173a384cfea48dbb676ee3bc88efb8.jpeg

81495d2c3b914fb794a8fc3e9d65f58f.jpeg

模式:统一语言、核心子领域、通用子领域、支撑子领域

可视化方法:业务流程图、服务蓝图、业务服务图、事件风暴

业务流程

第一层级,在业务目标指导下梳理出提供业务价值的动态业务流程。属于 5W 模型中的 When。

业务流程的起点往往由一个角色想目标系统发起服务请求,而要完成整个流程,则需要多个角色共同参与协作。业务流程的特点是:1)具有时间属性 2)多角色参与 3)输出业务价值

识别业务流程的两个关键点是:完整和边界。完整是指要具有端到端的完整协作过程,体现一个完整的业务价值;边界仍然是从业务价值层面确定业务的范畴。

可视化方案:业务流程图、服务蓝图

业务场景

场景就是角色之间为了实现共同的业务目标进行互动的时空背景,通过角色在特定时间、空间内执行的活动来推动情景的发展,形成角色与目标系统之间的体验与互动

第二层级,按照时间对业务流程进行切分,划分出每个时间阶段的业务场景,每个业务场景时可以由多个角色参与的。

13fe75185dfeacdfa314692391dcd74d.jpeg

业务流程与业务场景的区别与联系

一个动态的业务流程是由一到多个静态的业务场景构成的,业务流程是端到端的完整协作过程,业务场景则是在业务目标的指导下在时间维度对业务流程的纵向切分。

可视化方案:用例图,例如:

3db9222caab50678869b51537d5921bc.jpeg

业务服务

第三个层级,每个角色在业务场景下的一次功能性交互形成业务服务。业务服务是全局分析阶段的基本业务单元。属于 5W 模型中的 What。1)提供了目标系统的核心价值,满足了利益相关者的价值需求的业务服务,归入核心子领域 2)属于业务需求一部分,但是横向支撑了多个领域服务,不具有明显的个性特征的业务服务,则归入通用子领域 3)起支撑和辅助价值的业务服务,归入支撑子领域

架构映射阶段

分别从组织级、业务级和系统级三个层次完成对问题空间的求解,然后将其映射为架构层面的解决方案。这一步可以基于 C4 图的第一层来表示。C4 图画法参见《用于软件架构的 C4 模型》

bf54e386a8ab92905a7e97a53914755a.jpeg

组织级映射

目标是确定系统上下文。根据价值需求分析的结果,通过系统上下文呈现利益相关者、目标系统与伴生系统之间的关系。

模式:系统上下文

方法:系统上下文图、业务序列图

业务级映射

目标是确定限界上下文。根据业务需求分析的结果,对相关的业务服务进行归纳和分类,形成限界上下文。限界上下文内部采用菱形对称架构模式组织业务数据 &服务,限界上下文之间采用限界上下文映射模式解决它们之间的协作问题。

设计限界上下文的四要素:最小完备、自我履行、稳定空间、独立进化

模式:限界上下文、上下文映射和菱形对称架构

方法:V 型映射过程、事件风暴、服务序列图、康威定律、领域特性团队

限界上下文映射模式

领域模型需要通过限界上线文来限定业务的自治边界,限界上下文之间也需要通过各种方式进行协助,那么根据不同的协作方式,上下文映射关系可以划分为以下 8 中模式:

  • 客户方/供应方

  • 共享内核

  • 遵奉者

  • 分离方式

  • 开放主机服务

  • 发布语言

  • 防腐层

  • 大泥球

系统级映射

目标是建立分层架构。分层架构位于系统上下文内部,可考虑如下分层

cd98fc9bc6fd2ac068ffecf3738896c6.jpeg

模式:核心子领域、通用子领域、支撑子领域、系统分层架构

方法:康威定律

领域建模阶段

目标是在限界上下文内部建立领域模型。

领域建模可分为领域分析建模、领域设计建模和领域实现建模。

领域分析建模

在统一语言的指导下,通过快速建模法对业务服务进行提炼和抽象,获得领域分析模型。

快速建模法是对“名次动词法”的丰富和补充,建立了标准化的领域分析建模过程,它分为如下四个步骤:

217084387304c8f023eb830fdee124d1.jpeg

名词建模:识别业务服务规约中的名词。名词代表了候选对象,可将其映射为领域模型对象。

动词建模:识别业务服务规约中的动词。动词代表了候选对象上的候选操作,可将其映射为领域行为,若领域行为产生了过程数据(比如单据或交易记录等),则将该过程数据识别为领域概念。

归纳抽象:针对有定语修饰的领域概念进行归纳和抽象。

确定关系:确定领域概念之间的关系。

下面是最终产出的领域分析模型示意图:

9581445b444fa905e071e247bb5f3d9a.jpeg

产出是业务服务规约和领域模型概念图。

模式:统一语言、限界上下文、模型驱动设计

方法:快速建模法、事件风暴

领域设计建模

对完整业务服务展开设计工作,获得领域设计模型。

产出:以聚合为核心的静态设计类图和由角色构造型组成的动态序列图与序列图脚本。

方法:角色构造型、服务驱动设计

领域模型的设计要素

74b76ca9671dd7a4c335910c824b4fd7.jpeg

实体:一个典型的实体应该具备身份标识、属性和领域行为这 3 个基本要素,符合信息专家模式,避免贫血模型。

值对象:不需要被追踪且是不可变的,通常作为实体的属性。

聚合:聚合是介于限界上下文和类之间的一个封装层次,它是边界而不是对象,边界内保证对象的一致性和完整性,对外作为一个整体参与业务行为的协作。

领域服务:如果领域行为是无状态的,或者需要多个聚合的协作,又或者需要访问外部资源,则应该将它分配给领域服务。

领域事件:主要用于表达领域对象状态的迁移,也可以通过事件来实现聚合乃至限界上线文之间的状态通知。

模式:统一语言、模型驱动设计、实体、值对象等 DDD 基本设计元素

资源库:资源库是对数据访问的一种业务抽象,它分离了聚合的领域行为和持久化行为,保证了领域模型对象的业务纯粹性。

工厂:管理聚合的创建过程。

领域实现建模

基于 TDD 完成代码设计和单测编写,获得领域实现模型。

产出是实现业务功能的产品代码和验证业务功能的测试代码。

模式:统一语言、模型驱动设计

方法:测试驱动开发、简单设计、测试金字塔

- END -

往期回顾

一支不足百人的团队创造了 ChatGPT :90 后挑大梁,应届生 11 人,华人抢眼

JVM碰到问题,这几个工具不能少

聊聊流程引擎的架构设计

存储拆分后,如何解决唯一主键问题?

微服务架构中多级缓存设计

5个开源且简单实用的Code Review工具

大厂怎么做Code Review?

992eb7b23a3ea68e41002518689e3998.png

技术交流,请加微信: jiagou6688 ,备注:Java,拉你进架构群

肝货!万字长文助你上手DDD 限界上下文是语义和语境的边界。在问题空间,统一语言形成了团队对领域概念的统一表达,子领域形成了领域概念之间的边界。而在解空间,限界上下文可以看做是统一语言+子领域的融合体,统一语言需要在限界上下文内才具有明确的业务含义。以电商购物场景为例。在进行商品下单后,系统会生成一个订单;在用户付款完成后,系统也会生成一个订单;到了物流派送流程,系统还会生成一个订单。 阅读详情

相关推荐

万字长文助你上手软件领域驱动设计 DDD

作者:faryrong,腾讯 CSIG 后台开发工程师最近看了一本书《解构-领域驱动设计》,书中提出了领域驱动设计统一过程(DDDRUP),它指明了实践 DDD 的具体步骤,并很好地串联了各种概念、模式和思想。因此,我对书本内容做了梳理、简化,融入自己的理解,并结合之前阅读的书籍以及实践经验,最终形成这篇文章。希望可以帮助大伙理顺 DDD 的各种概念、模式和思想,降低上手...

腾讯技术工程 4270

最新领域驱动设计(DDD)资料合集(23份).zip

最新领域驱动设计(DDD)资料合集,共23份。 金融支付系统的改造之路 化繁为简--DDD驱动复杂业务软件架构的演进 基于DDD的领域建模中的模版和工具实践 基于FP的DDD实践 架构分层模型适配 可视化的遗留系统微服务改造 领域建模的易与难 领域驱动架构透析与架构解耦 领域驱动设计在系统重构中的应用实践 如何让DDD落地 淘宝应用架构升级——反应式架构的探索与实践 微服务的容器化实践 物联网平台的反应式设计 演进式架构的平台化落地 以DDD思想为基础的轻量级业务中台开发框架 用状态机封装领域逻辑 在一个实际复杂业务中落地DDD方法与相关架构 DDD促进传统架构微服务转型 DDD的为与不为 DDD实践中的那些坑 DDD在旅游电商架构演进中的实践 Every Entity as A Microservice Praise for Implementing Domain-Driven Design

张逸-构建领域驱动设计知识体系_compressed.pdf

张逸-构建领域驱动设计知识体系

设计之道 张逸

张逸 目 录设计,看上去很美设计,由你掌握重构初体验从企业的运行价值链说起使用极限编程改善项目的设计和灵活性从实例谈OOP、工厂模式和重构从实例谈Adapter 模式从Adapter模式到Decorator模式Visitor模式之可行与不可爱从容自若的CTOStrategy 模式的应用实践Factory Method 模式Composite 模式Iterator 模式

解构领域驱动设计- DDD 设计统一过程

领域驱动设计的核心是模型驱动设计,而模型驱动设计的核心又是领域模型,领域模型必须在统一语言的指导下获得。领域模型又可进一步细分为核心子领域、通用子领域和支撑子域。系统上下文、限界上下文、分层架构和聚合都属于领域驱动设计的边界控制手段,他们的区别在于对业务划分的粒度和维度不同。领域驱动设计统一过程“人类是通过在问题空间中寻找解决方案来解决问题的”同理,软件系统的构建实则是对问题空间的求解,以获得构成...

架构文摘 682

解构领域驱动设计--思维导图

小强快跑~~ 1545

解构领域驱动设计》读书笔记

复杂系统:由大量互相作用的部分组成的系统。这些组成部分相对简单,没有中央控制,组成部分之间也没有全局性的通信,并且组成部分的相互作用导致了复杂行为。影响阻碍理解能力的要素:影响阻碍预测能力的要素:软件系统的构建实则是对问题空间的求解,以获得构成解空间的设计方案。子领域、限界上下文、分层架构和聚合皆为领域驱动设计的核心元模型,分属战略设计和战术设计,贯穿了从问题空间到解空间的全过程。领域驱动设计(DDD)需要应对软件复杂度的挑战:领域驱动设计的开放性是其生命长青的基石,但

生活在别处 2165

DDD专家张逸:《解构领域驱动设计》前言

张逸读完需要5分钟速读仅需 2 分钟述说撰写《解构领域驱动设计》一书的心路历程,三年磨一剑的认真态度与艰辛苦楚,如今写作完毕,也算是苦尽甘来。本书将由人民邮电出版社异步图书社区出版,敬请...

中生代技术 3236

三年磨一剑,领域驱动设计布道师出版了《解构领域驱动设计

解构领域驱动设计 作者:张逸 本书全面阐释了领域驱动设计(domain-driven design,DDD)的知识体系,内容覆盖领域驱动设计的主要模式与主流方法,并在此基础上提出“领域驱动设计统一过程”(domain-driven design unified process,DDDUP),将整个软件构建过程划分为全局分析、架构映射和领域建模3个阶段。除给出诸多案例来阐释领域驱动设计统一过程中的方法与模式之外,本书还通过一个真实而完整的案例全面展现了如何进行领域驱动设计统一过程的实施和落地。为了

人邮异步社区 1045

右军:为张逸《解构领域驱动设计》推荐序

点击阅读原文进京东购买右军:领域驱动设计方面的书现在不是太多,而是太少。想必不少读者受过《领域驱动设计》和《实现领域驱动设计》两本书的启蒙。本书是我特别推荐的领域驱动设计方面的技术书,为何...

中生代技术 749

实现领域驱动设计(完整PDF版)

DDD的全称为Domain-driven Design,即领域驱动设计。下面我从领域、问题域、领域模型、设计、驱动这几个词语的含义和联系的角度去阐述DDD是如何融入到我们平时的软件开发初期阶段的。要理解什么是领域驱动设计,首先要理解什么是领域,什么是设计,还有驱动是什么意思,什么驱动什么。领域驱动设计(DDD)是教我们如何做好软件的,同时也是教我们如何更好地使用面向对象技术的。它为我们提供了设计软件的全新视角,同时也给开发者留下了一大难题:如何将领域驱动设计付诸实践?Vaughn Vernon 的这本《实现领域驱动设计》为我们给出了全面的解答。, 《实现领域驱动设计》分别从战略和战术层面详尽地讨论了如何实现DDD,其中包含了大量的最佳实践、设计准则和对一些问题的折中性讨论。《实现领域驱动设计》共分为14 章,在DDD 战略部分,《实现领域驱动设计》向我们讲解了领域、限界上下文、上下文映射图和架构等内容,战术部分包括实体、值对象、领域服务、领域事件、聚合和资源库等内容。一个虚构的案例研究贯穿全书,这对于实例讲解DDD 实现来说非常有用。, 《实现领域驱动设计》在DDD 的思想和实现之间建立起了一座桥梁,架构师和程序员均可阅读,同时也可

领域驱动设计:软件核心复杂性应对之道.pdf

领域驱动设计:软件核心复杂性应对之道.pdf

有了这两本书,学习领域驱动设计会很容易

自2003年EricEvans的著作《领域驱动设计》面世以来, 领域驱动设计(DDD) 相关的实践书籍并不多,整体的理论发展速度并不快,以至于很长一段时间,开发团队的实践过程总是磕磕绊绊, 这让他们觉得领域驱动设计的门槛很高,甚至有人怀疑领域驱动设计是否是一种足够成熟与体系化的方法论。 学习领域驱动设计有这两本书,一切将不再是 1、解构领域驱动设计 所谓“解构”,就是解析与重构: 解析,就是要做到知其然更知其所以然; 重构,则要做到青出于蓝而胜于蓝。 本书不再满足于粗略地将内容划分为战略.

人邮异步社区 4500

解构领域驱动设计(三):领域驱动设计

在上一部分,分层架构的目的是为了将业务规则剥离出来在单独的领域层中进行实现。再回顾一下领域驱动设计的分层中应用层代码的实现。 @Override public void pay(int orderId, float amount) { DesignerOrder order = designerOrderRepository.selectByKey(orderId); // 领域对象的加载 if (order == null) { AppException....

0x8g1T9E- 1987

2w字长文助你上手软件领域驱动设计 DDD

作者:faryrong,腾讯 CSIG 后台开发工程师领域驱动设计(DDD)由 Eric Evans 提出,并一经《领域驱动设计:软件核心复杂性应对之道》的发布,在软件行业中引起了不少的轰动。DDD 提供的一种新颖的,甚至有点“另类”的思维方式,它在告诉软件开发者“我们要用业务方案来解决业务问题,而不是技术方案解决业务问题”,有点魔法打败魔法的意思。DDD 虽然让人眼前一亮,但是所提倡的理念有点“违背直觉”(对开发人员而言),因此,在当时并没有流行开来。后来,微服务架构的兴起,大伙惊奇地发现 DDD 是作为

Java搜索工程技术栈 560

架构师面试必备:领域驱动设计(DDD)实战指南——如何用DDD思想解构复杂业务系统

在当今快速变化的技术环境中,领域驱动设计(DDD)已经从一种可选的设计方法,演变为评估架构师能力的关键指标。界限上下文是DDD中最关键的战略设计模式,它定义了特定模型的边界,在这个边界内,领域术语、业务规则和模型元素具有一致的含义。值对象的不可变性确保了其在领域模型中的安全性,当需要修改时,我们不是修改原有的值对象,而是创建一个新的实例。从业务需求分析到领域模型设计,从界限上下文划分到聚合实现,每一步都需要深入理解业务本质,运用DDD的核心概念和模式来构建清晰、可维护的系统架构。

zuiyuelong的博客 1121

DDD领域驱动设计内容分享(十九):给一个需求,请用DDD设计出来

限界上下文是语义和语境的边界。在问题空间,统一语言构成了团队对领域概念的统一表达,子领域形成了领域概念之间的边界。而在解空间,限界上下文可以看作是统一语言+子领域的结合体,统一语言在限界上下文内才具有明确的业务含义。以电商购物场景为例。在进行商品下单后,系统会生成一个订单;在用户付款完成后,系统也会生成一个订单;到了物流派送流程,系统还会生成一个订单。虽然这三个步骤中的领域概念都叫订单,但是他们的关注点/职责却不同:商品订单关注的是商品详情,支付订单关注的是支付金额和分润情况,物流订单关注的是收货地址。

之乎者也·的博客 1985
上一篇: 聊聊流程引擎的架构设计
下一篇: eBay 为何以及如何转向 OpenTelemetry
qianshanding0708
博客等级 码龄11年 397粉丝 96原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值