DDD精粹速读(一)

news/2024/9/18 8:51:54/文章来源:https://www.cnblogs.com/JavaEdge/p/18374999

1 你需要知道的 - 战略设计

DDD是一种软件设计和构建方法,其重点在于独立于数据持久化等技术问题,准确表达业务规则。

不幸,DDD 对新手来说极具挑战性,部分原因是它有许多独特的概念需要学习。本文我简要介绍这些重要的思想,以便你能自信继续你的 DDD 旅程。

第一部分将侧重于与所有参与软件开发的人相关的概念,而不仅仅是开发人员。第二部分专门针对编码人员,但无论如何你都可以随意查看!

2 我只剩一分钟空闲!

如果你只能从这篇文章中记住两点,那么 DDD 的核心主张是:

2.1 模型驱动设计

在自包含的领域模型中建模业务流程和规则是重中之重。从数据库设计到架构的其他所有内容都是次要的考虑因素。

2.2 通用语言

开发生命周期中的每个人都应该在特定上下文中使用领域/业务语言进行沟通。理想情况下,会维护一些轻量且易于访问的通用语言文档。

3 战略设计和战术设计

DDD 包含两个相关的学科:战略设计战术设计

战略设计

涉及大局观:理解业务需要解决的问题;业务如何获得竞争优势;团队之间的关系;并在考虑这些问题的情况下,决定要构建什么软件。

战术设计

涉及使构建有用领域模型更简单的模式、工具和实践。当我们需要建模复杂的业务逻辑或未来可能引入复杂性时,我们使用战术设计。

本质上:

  • 战略设计是关于我们需要构建什么
  • 战术设计是关于我们如何构建它

4 通用语言

无论是战略设计还是战术设计,其核心思想都是通用语言。这是一组明确且定义良好的术语,密切反映了业务环境中的语言。在对话、需求和代码中一致使用通用语言,可以消除从开发者术语到业务术语之间频繁转换所带来的负担和错误。

5 问题空间和解决方案空间

想象一下,一家公司提供外包的仓库运营服务(WOaaS)。它的“独门绝技”在于如何管理仓库库存,但它还需要进行销售、广告、跟踪工时等。

每个问题区域都可以被描述为一个子域。对于这家 WOaaS 公司,一个简化的问题空间地图可能如下:

图1: 一个分为四个部分的子域/问题空间简化图,标签为交付/收集、库存、销售和财务

在一个领域中识别问题区域称为问题空间分析。这需要与领域专家,即最了解业务的人密切合作。

将问题空间映射到当前的企业架构上,就得到了解决方案空间

图2: 一个分为四个部分的“现状”解决方案空间图。交付/收集部分有一个标记为第三方 SaaS 的紫色圆圈。另一个更大的紫色圆圈标记为遗留系统,覆盖了剩下的销售、库存和财务部分

接下来,我们想要确定一个更理想的解决方案空间。为此,反思通用语言的一个后果是很有帮助的。

6 有界上下文

在我们的例子中,一个遗留系统试图解决多个问题区域。尽管有才华的个人付出了最大的努力,它可能还是会因为一个简单的原因而面临高缺陷率和维护成本。

在每个子域中,词语和短语都有特定的含义。一个拥有冲突术语的代码库必然会迫使团队成员创建一种新的、即兴的语言,并且必须将其转换为业务语言。不可避免地,这会导致错误、误解、入职缓慢、部落知识等各种问题。

通过试图创建满足多个子域需求的软件,我们的模型变得臃肿、混乱且含糊不清,导致性能问题和复杂性升级。

战略设计建议每个子域单独使用一个系统。我们可以将这些系统描述为有界上下文,在每个上下文内都有明确的通用语言

现在,回到 WOaaS 公司。我们如何确定一个更理想的“未来”企业架构?我们应该构建什么才能实现最佳的业务结果?

7 核心领域

应该在业务创造竞争优势的子域中投入最多的资源,这些子域就是核心领域。在我们的例子中,这是库存子域。

应该为库存子域创建一个有界上下文,并组建最好的团队来开发它。

图3: 一个分为四个部分的“未来”解决方案空间简化图。交付/收集部分有一个标记为第三方 SaaS 的紫色圆圈。在库存部分有一个更大的紫色圆圈,标记为首要任务:库存有界上下文。另一个较小的紫色便签标记为遗留系统,覆盖了销售和财务部分

其他子域被称为通用子域支持子域。尽管它们很重要,但无论发票系统多么“美观”,它都不会使企业在竞争中脱颖而出。覆盖这些子域的系统可能是商业现成产品或外包开发的候选者。

核心领域值得最大的投资和 DDD 的战术设计的全力支持……你可以在本系列的第二部分阅读更多内容。

领域模型:仅描述业务环境中相关事物的行为、属性和交互的代码。它完全不涉及运行时环境、持久化、托管环境等问题。

关注我,紧跟本系列专栏文章,咱们下篇再续!

作者简介:魔都架构师,多家大厂后端一线研发经验,在分布式系统设计、数据平台架构和AI应用开发等领域都有丰富实践经验。

各大技术社区头部专家博主。具有丰富的引领团队经验,深厚业务架构和解决方案的积累。

负责:

  • 中央/分销预订系统性能优化
  • 活动&券等营销中台建设
  • 交易平台及数据中台等架构和开发设计
  • 车联网核心平台-物联网连接平台、大数据平台架构设计及优化
  • LLM Agent应用开发
  • 区块链应用开发
  • 大数据开发挖掘经验
  • 推荐系统项目

目前主攻市级软件项目设计、构建服务全社会的应用系统。
本文由博客一文多发平台 OpenWrite 发布!

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

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

相关文章

消息队列作用(解耦、异步、削峰)

原文:消息队列作用(解耦、异步、削峰)图详解一、消息队列简介 简单来说,“消息队列”是在消息的传输过程中保存消息的容器。MQ 全称为 Message Queue,消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信。 消…

C++ 链表

1. 前言 链表:不仅存储 当前元素的数据,还存储着 元素排列顺序 2. 正题 2.1 如何存储节点? 我们可以使用 结构体 数组来存储 链表节点 struct Node {int val; // 可以是 string 或其它复杂的类型int nxt; } node[N];Tip: 下标顺序不是单链表顺序val 代表 元素本身,nxt 代表…

WPF 模拟UWP原生窗口样式——亚克力|云母材质、自定义标题栏样式、原生DWM动画 (附我封装好的类)

先看一下最终效果,左图为使用亚克力材质并添加组合颜色的效果;右图为MicaAlt材质的效果。两者都自定义了标题栏并且最大限度地保留了DWM提供的原生窗口效果(最大化最小化、关闭出现的动画、窗口阴影、拖拽布局器等)。接下来把各部分的实现一个个拆开来讲讲。 一、使用窗口材…

Redis学习(一)

1.通用命令keys * del k1 exists k1 expipe k1 ttl k12.String类型String类型的常见命令 set k1 v1 添加键值对 get k1 v1 获得键值对对应的值 mset k1 v1 k2 v2 一次性设置多个值 mget k1 k2 k3 一次性获取多个键值对的值 incr k1 让k1自增 incrby k1 2 按步长2自增 dec…

C# WebSocket Fleck 源码解读

最近在维护公司旧项目,偶然发现使用Fleck实现的WebSocket主动推送功能,(由于前端页面关闭时WebSocket Server中执行了多次OnClone事件回调并且打印了大量的关闭日志,),后来我特地看了源码,这里做一些分享 github: https://github.com/statianzo/Fleck在源码中,作者在 Sam…

SuperCLUE整理

参考信息: git:https://github.com/CLUEbenchmark/SuperCLUE 官网:https://www.cluebenchmarks.com/superclue.html 23年7月论文 :https://arxiv.org/pdf/2307.15020: 24年4月报告:https://www.cluebenchmarks.com/superclue_2404 24年7月报告:https://www.cluebenchmar…

20240819编译 链接 单片机执行的第一个语句

2024年8月中旬在宝鸡出差,在B站上学习了下。 在linux操作系统中,gdb是调试器,gcc是编译器。 Linux 操作系统 将main.elf文件加载到内存中以后,操作系统为其分配进程,然后main函数就开始执行了。输入 layout asm 则显示出来汇编代码 键入 “starti”的时候 进入到程序里面的…

回溯part02

今天继续学习了回溯:组合求和的进阶 元素可以重复使用:backtracking(candidates, target, sum, i); // 不用i+1了,表示可以重复读取当前的数 数组去重:首先数组排序,然后使用used 分割回文子串问题,抽象为组合问题,注意如何判断是否是回文子串5. 39 组合总和(元素可重复…

2.系统定时器

系统定时器SYSTEM文件夹介绍1,sys文件夹介绍sys_nvic_set_vector_table():设置中断向量表地址sys_intx_enable():开启所有中断sys_intx_disable():关闭所有中断(但是不包括fault和NMI中断)sys_wfi_set():执行: WFI指令(执行完该指令进入低功耗状态)sys_standby():进入待机…

Terraform - 初解Terraform - 安装

开发环境配置 Note:安装环境为windows系统64位笔记本电脑 1.安装适用于 Windows 的 Terraform: https://developer.hashicorp.com/terraform/install 2.下载 Terraform: https://releases.hashicorp.com/terraform/1.9.4/terraform_1.9.4_windows_amd64.zip 3.从下载中,将…

python 05-标准库:csv、json、sqlite3、datetime模块

csv模块import csv# data.csv不存在时,会现在当前目录下创建一个data.csv文件 with open("data.csv", "w", encoding=utf-8) as file:writer = csv.writer(file)writer.writerow(["trasanction_id", "product_id", "price_id&qu…