DDD | 入门 - [概念体系]

INDEX

      • 接触 DDD 前的准备
        • 不要用和 MVC 对照的思想去接触 DDD
      • 领域 & 子域 & 界限上下文
        • 思路
        • 领域
        • 子域
        • 界限上下文
      • 领域的初步划分

接触 DDD 前的准备

不要用和 MVC 对照的思想去接触 DDD

不要用和 MVC 对照的思想去接触 DDD,这样你会很痛苦。
在之前 蛋式编程 这个帖子中阐述过,当我们使用 MVC 时,其实是在进行一个填表游戏,因为可以很自然的拆解出两个维度,业务以及我现在在针对那个层进行开发,如下图:
在这里插入图片描述所以,其实理论上一个 MVC 架构的项目在需求明确的一瞬间,上面的表格就已经确定了,同时,类的数量和他们各自是干什么的也已经确定了。

而在使用 DDD 时,我们可以理解为是收拾杂乱房间的过程
在这里插入图片描述
当我们开始使用 DDD 可开展工作的时候,我们面前尚未建模的部分就像这间屋子。如何收拾这样的屋子,我们需要归置散落的衣物,收拾未归为的小工具,收拾桌面,清理地面……

经过评估,上述工作我们都需要完成,任何一个缺失都不能算是我们已经完成了房间的清理,因此,我们认定刚刚提到的都是不同的领域。他们具有等同的地位,并且都需要分别关注。

然后,我们把目光聚焦到衣物上,那么衣物充斥了我们的视线,这是我们目前需要处理的领域。刚刚说的其他的问题?去他大爷的吧,现在我们只管衣物。然后,我们开始领域内建模,如何收集、折叠、识别、收纳这是后话,跳过。

总结刚刚经历过的过程,如下图所示

  • 我们从杂乱的业务信息中挑出一个
  • 以这个信息为核心聚拢周围的混沌,形成一个独立的小混沌团以完整的描述刚刚那个信息相关的所有
  • 现在这个小团的,就是以前混沌的业务里的一个方面
  • 重复上面的过程,使一开始的那一大团混沌不在有任何残留,完全只剩下若干个小的
    在这里插入图片描述

领域 & 子域 & 界限上下文

思路

我们怎么理解 DDD 中的领域。
先将它理解成业务系统本身,或业务系统一部分业务本身。这里需要注意一个误区,领域是你公司进行整体的业务或其一部分,而不是你正在开发(或者既存)的项目中业务的一部分。

这会导致很多开发人员认为自己目前项目中的一个模块就对应 DDD 中的一个领域。
而事实上并不是,可能你的项目整体上只是你所在部门的一个领域,甚至你所在公司整体业务中划分出来的众多领域中的一个。而你之前认为的模块,其实应该对应 DDD 中的一个界限上下文。

DDD 旨在使用领域模型进行设计,但绝不是希望将业务系统设计为一个整体、所谓内聚、完全功能的模型。而是在模型里架构一个结构清晰的体系,这个体系以领域为核心视角。

一个还处于混沌的领域中可能包括很多事物

  • 我们通常认为,从业务视角出发,如果一个事物与其他的事物都格格不入,那就应该排除在领域之外
  • 我们通常会确认这些事物中的一个作为当前这个领域的核心。如果存在多个我们确认这是业务核心的事物,那通常意味着需要对目前正在讨论的领域进行拆解,至少形成多个界限上下文甚至多个领域
  • 然后我们会发现,有一些事物并不是当前这个领域的核心关注点,但是它依然是领域的一部分。这些事物中的一些和当前领域的核心业务本身有关联,而另一些可以和很多领域产生关联

按刚刚粗略的划分,我还已经规定了领域和子域,其中子域又被细分为了核心子域、支撑子域、通用子域

现在,我们只是贴着领域进行了划分:把领域切割为了子域和子域之间的协作关系。但各个子域中,依然是混沌的,我们需要开发它。而开发一个混沌的东西的前提是我们需要先能准确的描述它,在 DDD 的核心思路里,开发是一个以领域业务专家为核心,专家、需求提出人、研发人员一起协作的集体行为,因此这要求我们可以准确并且统一的描述目前混沌的部分。准确并且统一的描述就是通用语言,通用语言在领域中的作用范围就是界限上下文。

领域

一块业务 A 本身

子域
  • 核心子域:领域中直接决定领域是否成功的那部分,领域业务里的核心焦点,可以认为核心子域就是当前领域想做的事本身
  • 支撑子域:领域中不可或缺,是业务的重要方面,但是又不属于核心的部分。这些子域对应的概念,很有可能是另一个领域中的核心域,但在当前的领域里,它虽然重要但也不是我们的核心关注点,所以只是一个支撑子域
  • 通用子域:在领域中有体现,但他被广泛的应用于整个业务,那它就可以被定义为一个通用子域。一个简单的区分支撑子域和通用子域的方法:只从可行性上进行分析,你的项目敢通过购买的方式得到这个子域吗?如果可行,那就是通用子域
界限上下文
  • 通用语言在领域中的作用范围
  • 通用语言是领域模型的边界
  • 通常和子域是 1 对 1 的

领域的初步划分

刚刚接触 DDD 的新手,通常苦于如何迈出 DDD 实践的第一步,如何划分领域

面提供一种初步划分领域的方式,也是初学者最有可行性的实践方式:

  • 准备完整的可以描述你整个业务的文档,准备若干有颜色的笔(或者一把剪刀和足够大的桌子)
  • 完整的阅读你整个业务文档
  • 再次完整的阅读你整个业务文档,用不同颜色标记几个明显非常核心的信息
  • 围绕这些信息用对应的颜色标注整个文档的其他信息,知道标无可标
  • 检查文档现在不含颜色的部分,尝试从其中得到另一个核心信息,并在文档中的无颜色部分中标注对应颜色
  • 重复上面的步骤,知道整个文档不再含有无颜色的部分
  • 归纳各个颜色下的信息,这些就是初步划分的领域和其下的所有已知信息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/284486.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux下Netty实现高性能UDP服务

前言 近期笔者基于Netty接收UDP报文进行业务数据统计的功能,因为Netty默认情况下处理UDP收包只能由一个线程负责,无法像TCP协议那种基于主从reactor模型实现多线程监听端口,所以笔者查阅网上资料查看是否有什么方式可以接收UDP收包的性能瓶颈…

IDEA报错处理

问题1 IDEA 新建 Maven 项目没有文件结构 pom 文件为空 将JDK换成1.8后解决。 网络说法:别用 java18,换成 java17 或者 java1.8 都可以,因为 java18 不是 LTS 版本,有着各种各样的问题。。

手拉手EasyExcel极简实现web上传下载(全栈)

环境介绍 技术栈 springbootmybatis-plusmysqleasyexcel 软件 版本 mysql 8 IDEA IntelliJ IDEA 2022.2.1 JDK 1.8 Spring Boot 2.7.13 mybatis-plus 3.5.3.2 EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。 他能让你在不用考虑性…

OpenSergo Dubbo 微服务治理最佳实践

*作者:何家欢,阿里云 MSE 研发工程师 Why 微服务治理? 现代的微服务架构里,我们通过将系统分解成一系列的服务并通过远程过程调用联接在一起,在带来一些优势的同时也为我们带来了一些挑战。 如上图所示,可…

C++学习笔记(十二)------is_a关系(继承关系)

你好,这里是争做图书馆扫地僧的小白。 个人主页:争做图书馆扫地僧的小白_-CSDN博客 目标:希望通过学习技术,期待着改变世界。 提示:以下是本篇文章正文内容,下面案例可供参考 文章目录 前言 一、继承关系…

HIVE窗口函数

什么是窗口函数 hive中开窗函数通过over关键字声明;窗口函数,准确地说,函数在窗口中的应用;比如sum函数不仅可在group by后聚合,在可在窗口中应用; hive中groupby算子和开窗over,shuffle的逻辑…

使用DTS将自建MySQL迁移至PolarDB MySQL引擎,探索DTS全量数据校验

1. 领取免费的ECS和PolarDB资源 一旦您注册了阿里云账号并填写了您的账号和支付信息,您就可以申请免费试用我们的产品(如ECS、PolarDB、RDS等服务)。 1.1. 申请 ECS 免费试用 1. 在 阿里云免费试用中心,找到ECS,单击…

【数据结构】八大排序之简单选择排序算法

🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 一.简单选择排序简介及思路 二.简单选择排序的代码实现 三.简单选择排序的优化 四.简单选择排序的时间复杂度分析 结语 一.简单选择排序简介及思路 简单选择排序算法…

力扣225. 用队列实现栈【附进阶版】

文章目录 力扣225. 用队列实现栈示例思路及其实现两个队列模拟栈一个队列模拟栈 力扣225. 用队列实现栈 示例 思路及其实现 两个队列模拟栈 队列是先进先出的规则,把一个队列中的数据导入另一个队列中,数据的顺序并没有变,并没有变成先进后…

羊大师之冷天喝羊的好处大揭秘!

最近,冷天喝羊已经成为了一种趋势,受到了越来越多人的关注与喜爱。你可能会好奇,为什么冷天喝羊有那么多的好处呢?今天小编羊大师将带大家一起探索这个问题,揭秘冷天喝羊带来的种种益处。 冷天喝羊对于保持身体温暖是…

pr-卡点

目录 自定义创建序列关闭拉动时音频 自定义创建序列 关闭拉动时音频 难点:寻找精准衔接画面

Transformer Decoder的输入

大部分引用参考了既安的https://www.zhihu.com/question/337886108/answer/893002189这篇文章,个人认为写的很清晰,此外补充了一些自己的笔记。 弄清楚Decoder的输入输出,关键在于图示三个箭头的位置: 以翻译为例: 输…