前往小程序,Get更优阅读体验!
立即前往
社区首页 >专栏 >DDD概述

DDD概述

作者头像
JavaEdge
发布于 2023-03-19 02:36:12
发布于 2023-03-19 02:36:12
3860
举报
文章被收录于专栏:JavaEdgeJavaEdge
  • 程序设计语言指导怎样把设计更好地落地
  • 各种编程范式指导可以用什么样的元素去做设计
  • 设计原则与模式指导如何组合分解出来的各个元素

分解组合的东西是从哪来?

需要你对设计方法有一个基本的认知,要理解真实世界中,解决具体问题的过程。

来谈谈设计方法,了解一下设计的基本过程。

1 哪些设计方法

有些人一上来会先设计DB,因为它们觉得,程序=数据+函数:

  • 数据呢,就要存到数据库
  • 剩下的就是根据需要对数据库表进行增删改查

这实际上是一种结构化编程的思路。

后来有人就用OO,先找实体,即对象,当然这些实体也要有一些能力。最终,这些对象还是要写到数据库里,同样也是要支持增删改查。

本质上没啥区别,都是围绕数据处理。业务需求不复杂时,围绕数据做文章的做法还能满足开发要求,但软件越来越复杂,这种做法就越发笨拙。 如果我们靠着程序员们本能的做法,就会遇到各种问题,所以,很多人探索了不同做法。

有一种做法逐渐脱颖而出,它成功地解决业务软件开发中遇到的大部分问题,这就是DDD。虽然它不是万能药,但对大部分人面对的场景而言,它都能够有效地应对。

2 DDD

从 Eric Evans 的著作《领域驱动设计》正式出版开始。

这种设计方法通过使用通用语言,让业务人员加入到设计过程中,拉近了业务人员与开发人员之间的距离,打破了组织的藩篱。提供了一套标准建模方法,帮助团队识别业务模型,避免程序员犯下一些低级错误。

然而很多程序员不知道 DDD,一个重要原因是 Eric 这本书写得实在不咋样。要想读出东西,你得比较懂DDD,但大多数人并不懂。

后来,微服务兴起,人们越发认识到,微服务难度不在于将一个系统拆分成若干服务,而是如何有效划分微服务。 这时,人们发现,DDD是最好指导。

学习 DDD,就要从理解 DDD 的根基入手:通用语言(Ubiquitous Language)和模型驱动的设计(Model-Driven Design),而领域驱动设计的过程,就是建立起通用语言和识别模型的过程。

3 通用语言

在业务人员和开发人员之间建立起的一套共有的语言。在从前的设计方法中,业务人员总是把问题扔过墙头,让开发解决:

  • 业务说的都是业务名词:产品、订单等
  • 开发嘴里都是技术:线程、存储等

二者除了最基础的几个概念之外,其他内容基本无法沟通。人为屏障就存在于开发和业务间。

软件设计是要在问题和解决方案架设一座桥梁,好的设计要更接近问题。开发人员对解决方案一端简直再熟悉不过了,但是对业务一端理解则通常不够充分。而通用语言所做的事情,就是把开发人员的思考起点拉到了业务上,也就是从问题出发,这就在一定程度上填平了那道人为的鸿沟。

通用语言是什么

就是这个业务中有哪些概念以及哪些操作。

如做电商平台,就要有产品、订单的概念。其中,产品就要有上架、下架、修改产品信息等操作,而订单就会有下单、撤单、修改订单等操作。

在业务人员看来,这里说的都是自己擅长的事情,自己就可以有更多的发言权。在开发人员的视角,概念就是一个一个的类,操作就是一个一个的方法,也很好理解。有一套通用语言,皆大欢喜。

通用语言从哪来

即如何设计通用语言呢?最简单的,让业务人员和开发人员一起,找一块白板,把各种概念都写在上面。然后,双方重新进行分类整理。

这里面的重点是,让业务人员和开发人员在一起。如果只让一方出现,结果又会是原来的样子,因为你没法判断,这里面的语言对方是否听得懂。这种做法很简单,但通常都不够系统,会存在各种遗漏。所以,有人探索出一种更正式的实践:事件风暴(Event Stroming)。

4 事件风暴

一个工作坊,找一面很宽的墙,上面铺上大白纸,然后,用便利贴把识别出来的概念贴在上面。当然,前提依然是让业务人员和技术人员都参与。

事件风暴的关注点在于领域事件。领域事件是用来记录业务过程中发生过的重要事情,比如,作为电商平台的工作人员,你想知道产品是不是已经上架了,这个领域事件就是产品已上架;作为消费者,你会关心我的订单是不是下成功了,这个领域事件就是订单已下。

人们做了一个动作,都会关心做过这个动作之后的结果,所以,领域事件用的描述方式都是过去式,比如:OrderPlaced。

4.1 事件风暴步骤

① 把领域事件识别出来

这个系统有哪些是人们关心的结果。有了领域事件,下面一个问题是,这些事件是如何产生的,它必然会是某个动作的结果。

② 找出这些动作

即引发领域事件的命令。如:

  • 产品已上架,由产品上架这个动作引发
  • 订单已下,就由下单这个命令引发的
③ 找出与事件和命令相关的实体或聚合

如,产品上架就需要有个产品(Product),下单就需要有订单(Order)。

至此,已将最核心的内容找出来了。工作坊过程中,为增强趣味性和清晰性,不同的概念会用不同的颜色的便利贴标识出来,比如,领域事件用橙色、命令用蓝色、实体/聚合用黄色等等。

用不同的颜色建模,事件风暴并不是独一份。Peter Coad也曾提出四色建模:

  • 粉色表示时标性对象(moment-interval)
  • 黄色表示角色(role)
  • 蓝色表示描述(description)
  • 绿色表示人、地点、物(party/place/thing)。

5 模型

模型是对领域的抽象和模拟:

建模是针对特定问题建立领域的合理模型:

6 模型驱动设计

有了通用语言,接下来就进入模型设计阶段了。虽然有了通用语言,但是业务人员能够帮到开发人员的还是很少,他们只能告诉开发人员哪些模型是符合业务概念的。

但这么多的业务模型,该如何组织呢?怎样补全欠缺的模型,使之成为一个可以落地的方案呢?这就是开发人员要想办法解决的事情了。

也正是因为在通常情况下,业务模型数量众多,所以在 DDD 的过程中,我们将设计分成了两个阶段:

战略设计(Strategic Design)

高层设计,将系统拆分成不同领域。而DDD核心概念就是领域,即它给了我们一个拆分系统的新视角:按业务领域。如将电商系统拆分成产品域、订单域、支付域、物流域等。拆分后,识别出来的各种业务对象就会归结到各领域。

然而,有时不同领域的业务对象会进行交互,比如想知道订单的物流情况。所以,要在不同领域之间设计一些交互方式。

战术设计(Tactical Design)

低层设计:如何具体组织不同的业务模型。该层次上,DDD 提供了一些标准做法。如哪种模型应该设计成实体,哪些设计成值对象。

还要考虑模型之间的关系,比如,哪些模型要一起使用,可以成为一个聚合。接下来,我们还需要考虑这些模型从哪来、怎样演变,DDD 同样为我们提供了一些标准的设计概念,比如仓库、服务等等。

7 系统复杂性的来源

7.1 业务复杂导致模型复杂

若同时考虑三个业务呢?就会变得很复杂:

7.2 技术实现引入额外复杂性

团队 A 负责数据接入,开发接口简单直接,商品和门店数据完全解耦。 团队 B 负责商品服务,开发商品搜索时,可能要支持对地理信息、门店的搜索,如优先搜索附近门店的商品,那就需要结合商品、门店的数据。

为提高搜索的实时性,AB 商讨在 A 构建数据时,为 B 的商品搜索服务再构建一份门店商品数据。

于是就导致 A 系统变化:

导致 A 系统为此,还得考虑额外的复杂性。

因此,传统软件设计无法解决这些问题,但是 DDD 可以:

9 DDD 的核心思想

9.1 模型分解

将复杂的问题,划分成多个相对简单的模型,让不同模型去解决不同问题。

领域划分
限界上下文

9.2 模型驱动设计

通过分层架构隔离领域层、仔细选择模型和设计方案等措施保持实现与模型的一致。 所以,对之前案例,应将搜索子领域单独提出来,从商品业务领域获取数据,当然了,中间也要经过防腐层(转换层)。于是,就达到了模型驱动设计。

8 有助于解决系统老化问题

新需求越来越难

我又不贷你这系统具体怎么实现的系统越来越复杂,需求要怎么提?

开发越来越难

一个类上千行代码,这怎么看?这段代码有什么用? 能不能去掉?

技术创新越来越难

外面新技术越来越多,我们这个老系统没时间重构,越拖越烂。

测试越来越难

没办法单元测试,一个小需求又要回归测试。累死了。

总结

理解DDD就要理解通用语言和模型驱动设计。 通用语言就是要把业务人员和开发人员对具体业务概念和逻辑的理解达成一致,可使用事件风暴和彩色建模等方法建立通用语言 模型驱动设计可以从战略设计和战术设计两方面入手,战略设计属于高层设计,将系统安装领域拆分;战术设计属于低层设计,考虑的是如何组合业务模型 建立一套业务人员和开发人员共享的通用语言

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-03-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一文一点 | 你认为什么是DDD设计方法的基石
所有的软件最终是要解决用户问题的,而软件的落地最终是要靠一行行的代码垒起来的,那么这个时候从识别出用户问题到代码实现之间就需要一种过度,而架构设计就是这种过度的【桥梁】。
王新栋
2020/09/08
5590
一文一点 | 你认为什么是DDD设计方法的基石
重新温习软件设计之路(5)
本文是我学习课程《软件设计之美》的学习总结第五部分,记录对于DDD领域驱动设计方法的整体理解。
Edison Zhou
2021/01/26
4800
重新温习软件设计之路(5)
限界上下文是什么鬼?DDD 最抽象的概念详解
- 什么是通用语言 - 通用语言, 最主要的目的就是减少交流中信息丢失, 在实际开发中, 可能关联很多人, 例如有业务层面的业务细节制定者、领域专家、产品经理、项目经理 、架构师、开发
玄姐谈AGI
2021/07/29
5.9K0
《软件设计之美》阅读笔记
模型是一个软件的核心;模型的粒度可大可小;模型应该高内聚,低耦合;模型可以分层,底层模型提供接口来构建上层的模型。
chuckQu
2022/08/19
4400
DDD领域驱动实战 - 限界上下文(bounded context)
限界上下文定义领域边界,以确保每个上下文含义在它特定的边界内都具有唯一的含义,领域模型则存在于这个边界之内。
JavaEdge
2020/10/02
4.3K0
DDD领域驱动实战 - 限界上下文(bounded context)
领域驱动DDD 业务浅析
模式这个词的来源是建筑学,不同的建筑所采用的建筑模式也不一样,建筑模式是特定建筑领域中 设计优秀建筑的指南。
北洋
2023/12/15
1490
网易严选商品中心DDD实践
商品中心随着自身业务的发展,系统复杂度逐渐变高。在业务治理过程中,我们尝试引入了DDD来辅助进行现有业务的模型重建,并在此基础上完成了中台服务能力的沉淀和对外提供。通过将核心业务逻辑下沉内聚,降低调用方的业务复杂度,防范逻辑腐化。
从大数据到人工智能
2022/09/02
7040
网易严选商品中心DDD实践
一文带你落地DDD
hello,everyone,好久不见。最近几周部门有个大版本发布,一直没有抽出时间来写博。由于版本不断迭代,功能越做越复杂,系统的维护与功能迭代越来越困难。前段领导找我说,能不能在架构上动手做做文章,将架构迁移到DDD。哈哈哈哈,当时我听到这个话的时候瞬间来了精神。说实话,从去年开始从大厂的一些朋友那里接触到DDD,自己平时也会时不时的阅读相关的文章与开源项目,但是一直没有机会在实际的工作中实施。正好借着这次机会可以开始实践一下。
柏炎
2022/08/23
8030
一文带你落地DDD
浅谈我对DDD领域驱动设计的理解
从遇到问题开始 当人们要做一个软件系统时,一般总是因为遇到了什么问题,然后希望通过一个软件系统来解决。 比如,我是一家企业,然后我觉得我现在线下销售自己的产品还不够,我希望能够在线上也能销售自己的产品。所以,自然而然就想到要做一个普通电商系统,用于实现在线销售自己企业产品的目的。 再比如,我是一家互联网公司,公司有很多系统对外提供服务,面向很多客户端设备。但是最近由于各种原因,导致服务经常出故障。所以,我们希望通过各种措施提高服务的质量和稳定性。其中的一个措施就是希望能做一个灰度发布的平台,这个平台可以提供
逸鹏
2018/04/11
1.3K0
浅谈我对DDD领域驱动设计的理解
领域驱动设计-上
随着软件系统越来越庞大,需求越来越模糊,代码越来越混乱,测试越来越困难,技术演进基本不可能,而其中大型复杂的软件项目更容易走向系统老化的过程,形成需求难、开发难、测试难、创新难,单体架构局部业务膨胀可以拆成微服务,那么微服务局部业务膨胀又应该怎么做?DDD之所以火,即能解决微服务解决不了的问题。DDD是为了解决快速变化、复杂系统的设计问题。
用户7353950
2022/06/23
4770
领域驱动设计-上
架构六大思维养成记
当谈到软件架构的时候你不能只想到spirng、springmvc、mysql,你也真不应该想到它们,虽然它们是你落地的载体。至少你不能先想到它们,软件架构不依赖这些框架或者具体的数据库,这些东西统统需要延后,延后。
王新栋
2021/02/19
5990
架构六大思维养成记
领域驱动设计(DDD)部分核心概念
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/03/30
3980
领域驱动设计精粹(中)
领域驱动设计学习拦路虎之一就是众多的概念,第一次接触这些概念会有一定的理解成本,不过正是这些概念支撑起的领域驱动设计,接下来会以电商为例对其中的核心概念做介绍。
知一
2022/09/23
9260
领域驱动设计精粹(中)
DDD开篇总结
对于DDD的启蒙,不管是国内还是国外思维逻辑都是一样的。或者说如果你想写本关于DDD的书,大纲似乎是一样的
码农戏码
2021/03/23
5010
走近DDD
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/03/04
3780
DDD领域驱动设计初探
我们怎么用一套系统化的方法,抽丝剥茧、一步一步地把需求落实到代码呢?咱们看看下面这张图,它表示了领域驱动设计中的主要流程。
燃192
2023/04/10
4510
DDD领域驱动设计初探
DDD领域驱动设计落地实践系列:初识DDD
笔者在经历的很多项目中都使用了DDD领域驱动设计进行架构设计,尤其是在业务梳理、中台规划以及微服务划分等方面,DDD是重要的架构设计方法论,对平时的架构设计有非常好的指导作用。从本文开始笔者将通过一系列的文章阐述自己对于DDD的理解以及如何在项目实战中落地实践DDD。本文作为系列文章的开端,主要和大家聊聊DDD的一些基本概念以及使用背景。
慕枫技术笔记
2023/03/20
5620
DDD领域驱动设计落地实践系列:初识DDD
探秘微信业务优化:DDD从入门到实践
引言 | 本文作者从微信团队维护的带货类项目所遇卡点出发,尝试用领域驱动设计方法(简称DDD),保障在快节奏、多人协作的项目迭代中,维持系统的可维护性、可拓展性、高内聚低耦合和稳定性。作者首先剖解相关概念原理,之后代入亲身参与的微信团队实际项目、围绕DDD方法进行优化实操。 DDD 全称 Domain-Driven Design,中文叫领域驱动设计,是一套应对复杂软件系统分析和设计的面向对象建模方法论。它由Eric Evans于2003年提出,但一开始不愠不火。直到MartinFowler于2014年发表论
腾讯云开发者
2022/12/09
1K0
探秘微信业务优化:DDD从入门到实践
谈一谈 DDD
最近 10 年的互联网发展,从电子商务到移动互联,再到“互联网+”与传统行业的互联网转型,是一个非常痛苦的转型过程。在这个过程中,一方面会给我们带来诸多的挑战,另一方面又会给我们带来无尽的机会,它会带来更多的新兴市场、新兴产业与全新业务,给我们带来全新的发展机遇。然而,在面对全新业务、全新增长点的时候,我们能不能把握住这样的机遇呢?
冬夜先生
2021/12/06
4900
DDD 领域驱动设计落地实践系列:战略设计和战术设计
通过前面的文章介绍,相信大家对于什么是 DDD 有了初步的了解,知道它是一种微服务的架构设计方法论,为我们解决如何建立领域模型,如何实现微服务划分等提供了方向和指导。但是对于如何具体落地使用 DDD,可能大家还是一脸懵 B 的状态,因此从本文开始以及后面的文章将对如何进行 DDD 落地进行详细的阐述。在这其中还是会涉及到 DDD 中的一些重要概念,原本想着在一篇文章中介绍所有的概念,但是我觉得,概念总是在它该出现的时候出现才会让大家印象深刻,否则这些概念只是死板的概念,我们不清楚他为什么出现以及可以解决什么问题。
慕枫技术笔记
2023/03/20
8870
DDD 领域驱动设计落地实践系列:战略设计和战术设计
相关推荐
一文一点 | 你认为什么是DDD设计方法的基石
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档