十年开发老司机,感悟DDD领域驱动设计的战略设计到底是什么?

简介: 模型设计,DDD 分两阶段,战略设计和战术设计。

模型设计,DDD 分两阶段,战略设计和战术设计

战略设计

战略设计的子域、限界上下文和上下文映射图等概念大致分为:


  • 业务划分
    以区分不同业务,即划分识别出来的业务概念
  • 落地成解决方案
    将划分出来的业务落地

业务概念的划分

首先需要明确:

问题是什么

我们要解决的问题就是领域问题,相关概念如,子域、核心域、支撑域、通用域等。其实都是:如何分解问题。

如何解决

领域(Domain)是一号位,对应待解决的问题。解决问题通常思路是分而治之,DDD就把一个大领域分解成若干小领域(子域(Subdomain))。


DDD首先要建立起一套通用语言,拥有一致的业务词汇表,它们对应模型。

接着,要分类词汇,即把它们划分到不同子域。关键就是分离关注点。


比如,做个项目管理软件,就要有用户、项目、团队,不同人还要扮演不同角色。

第一步,至少先分开身份管理、项目管理,因为关注点不同:


  • 身份管理,关注用户身份信息,如用户名、密码
  • 项目管理,关注项目和团队等


这就有了俩子域:身份管理,项目管理。


若直接给结果,你可能会觉得很好理解。但划分出不同子域还是容易出问题的,因为有些概念不易区分。

比如,用户应该怎么划分?放在身份管理是合适的,但项目管理也要用到呀!


根据单一职责原则,它给了我们一个重要思考维度,变化从何而来

不同角色的人关注不同变化,所以,虽然我们用的词都是“用户”,但想表达的含义其实不同,最好分开这些不同的含义,即分开不同角色:

业务概念的落地

DDD问题层面的概念已经阐述完毕。接下来,就是解决方案层面。


切分出的子域,怎样落实到代码?

首先要解决的就是这些子域如何组织?


  • 写一个程序把所有子域都放里面
  • 每个子域单独做个应用
  • 有一些在一起,有一些分开


这就引出DDD的

限界上下文(Bounded Context)

限定了通用语言自由使用的边界,一旦出界,含义便无法保证。

比如,同样是“订单”,不加限制,很难区分它在哪种场景。一旦定义了限界上下文,那交易上下文的“订单”和物流上下文的“订单”肯定不同。就是因为订单这个说法,在不同边界内,含义不同。


注意,子域和限界上下文不一定是一一对应的,可能在一个限界上下文中包含了多个子域,也可能在一个子域横跨了多个限界上下文。


限界上下文是在解决方案层面,所以,就可以把限界上下文看作一个独立系统。限界上下文与微服务的理念契合,每个限界上下文都可成为一个独立服务。


限界上下文是完全独立的,不会为了完成一个业务需求要跑到其他服务中去做很多事,这恰是很多微服务出问题的点,比如一个业务功能要调用很多其他系统功能。


有限界上下文,就可以把整个业务分解到不同的限界上下文中,但是,尽管我们拆分了系统,它们终究还是一个系统,免不了交互。

比如:


  • 一个用户下了订单,这是在订单上下文中完成的
  • 用户要去支付,这是在支付上下文中完成的


我们要通过某种途径让订单上下文的一些信息发送到支付上下文。所以,要有一种描述方式,描述不同限界上下文之间交互的方式-上下文映射图(Context Map)。

DDD 给我们提供了一些描述这种交互的方式,比如:

  • 合作关系(Partnership)
  • 共享内核(Shared Kernel)
  • 客户-供应商(Customer-Supplier)
  • 跟随者(Conformist)
  • 防腐层(Anticorruption Layer)
    防腐层是最具防御性的一种关系,就是在外部模型和内部模型之间建立起一个翻译层,将外部模型转化为内部模型。但凡有可能,就要建立防腐层,将外部模型完全隔离开。
  • 开放主机服务(Open Host Service)
  • 发布语言(Published Language)
  • 各行其道(Separate Ways)
  • 大泥球(Big Ball of Mud)
    要规避


这么多交互方式,主要是为让你在头脑中仔细辨认,看看限界上下文之间到底在以怎样的方式交互。


知道不同限界上下文之间交互方式后,不同交互方式就可落地为不同协议。

常用协议如:REST API、RPC 或是 MQ, 按需选型即可。


在我们定义好不同的限界上下文,将它们之间的交互呈现出来之后,就得到了一张上下文映射图。

上下文映射图是可以帮助我们理解系统的各个部分之间,是怎样进行交互的,建立全局性认知。


目录
相关文章
|
Cloud Native 架构师 Devops
云原生时代领域驱动设计(DDD)的价值——从《没有银弹》说起
软件开发需要面对本质困难和附属困难。云原生、DevOps实践大幅降低了附属困难,使得架构师可以全力聚焦于业务复杂性,而DDD恰是管理业务复杂性的有效方法。
1517 0
云原生时代领域驱动设计(DDD)的价值——从《没有银弹》说起
|
7月前
|
设计模式 架构师 程序员
DDD洋葱架构才是 yyds!阿里大牛手记(DDD)领域驱动设计应对之道
虽然身为架构师,设计一个高质量的架构依然是复杂与困难的。 简单来说,动用大量的资源只为了一套优质的三高架构并不正确,而是该在了解当前业务现状的情况下,创造出灵活、可维护、健硕能成长的。
|
消息中间件 运维 前端开发
DDD实战之六:战略设计之技术决策
DDD实战之六:战略设计之技术决策
DDD实战之六:战略设计之技术决策
|
存储 缓存 负载均衡
|
存储 架构师 程序员
为了成为一名架构师必须稳扎稳打,软件架构设计知行合一很重要
最近在看程序员向架构师转型这本书,同时也做了思维导图的笔记,确实也是有一些收获,在为做好一个架构师而做准备,通过学习架构设计的原则到设计架构的过程来对架构师的工作有更大而全的认识。
|
架构师 前端开发 程序员
为了成为一名架构师必须稳扎稳打,软件架构设计的基本概念
软件行业的人才结构是金字塔,我们的目标就是向塔尖走去,从程序员到技术经理或者程序员到架构 师,都是我们职业路上所追求的。
|
缓存 监控 中间件
大白话之辩论DDD,阿里面试中台化理解
我在最近一年经常听到大家在讨论DDD,而且议论纷纷,大家各抒己见。 比如说在某技术微信群讨论,有些人说DDD是噱头,为了搞个业绩(又不是不能跑 😉),还有些表示自己是CRUD Boy 不知道DDD是什么高大上东西。 接下来我用大白话来表达我对DDD的看法。
282 0
大白话之辩论DDD,阿里面试中台化理解
|
设计模式 移动开发 前端开发
怎么说服领导,能让我用DDD架构肝项目?
我也苦思冥想,怎么跟领导说咱们从 MVC 升级到 DDD 吧,因为 DDD 代码结构更加清晰、领域驱动比测试驱动开发更加先进、研发的兄弟们也更想用用新框架等。
323 0
怎么说服领导,能让我用DDD架构肝项目?
|
前端开发 架构师 NoSQL
DDD领域驱动设计落地实践系列:战略设计和战术设计
通过前面的文章介绍,相信大家对于什么是DDD有了初步的了解,知道它是一种微服务的架构设计方法论,为我们解决如何建立领域模型,如何实现微服务划分等提供了方向和指导。但是对于如何具体落地使用DDD,可能大家还是一脸懵B的状态,因此从本文开始以及后面的文章将对如何进行DDD落地进行详细的阐述。在这其中还是会涉及到DDD中的一些重要概念,原本想着在一篇文章中介绍所有的概念,但是我觉得,概念总是在它该出现的时候出现才会让大家印象深刻,否则这些概念只是死板的概念,我们不清楚他为什么出现以及可以解决什么问题。
DDD领域驱动设计落地实践系列:战略设计和战术设计
|
弹性计算 Cloud Native 云计算
开发者必看,教你如何Get技术管理者思维!(你还不收藏吗?)
阿里内外专家联手打造技术管理专场,让开发者能在面对竞争、行业的快速变化中,提升自我能力,具备前瞻性和大胆的技术创新,保障业务的顺滑发展。
9531 0
开发者必看,教你如何Get技术管理者思维!(你还不收藏吗?)