DDD精粹速读(一)

news2025/1/11 11:50:44

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.coloradmin.cn/o/2065069.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数学建模比赛(国赛)水奖攻略

之前很多同学私聊问我,学校要求参加数模比赛,但是不擅长建模编程,但又不想浪费这个时间该怎么办呢,今天就来给大家讲一下大家都非常感兴趣的内容——数学建模水奖攻略。分享一下博主直接参加比赛时候的经验。 一、选题技巧 有一句…

【QT】学习笔记:关于“初始化列表中的成员变量”

一、问题1 以下代码是什么意思? MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) , ui(new Ui::MainWindow) {ui->setupUi(this); }MainWindow::~MainWindow() {delete ui; } 好的,我来为你解释这段 Qt 代码: 整体概述…

Linux(面试篇)

目录 什么是Linux 什么是Linux内核? Linux的基本组件是什么? Bash和Dos之间基本区别是什么? 什么是Root账户 什么是Bash? 什么时CLI? Linux的目录结构时怎样的? 什么是硬链接和软链接? 什么叫CC攻击&#…

景联文科技:专业人像采集服务,助力人像采集在多领域应用

随着社会的数字化和智能化进程不断推进,人像采集在多个领域中扮演着至关重要的角色,不仅可以提升安全性,还为人们的日常生活带来了更多的便捷。 应用场景: 1. 身份验证与生物识别: 机场、火车站等交通枢纽的身份核验…

docker具体操作

安装docker : 前提 centos 7 64位 centos内核版本3.10以上 1 uname -r 查看内核 2 yum install -y yum-utils device-mapper-persistent-data lvm2 下载依赖包 3 um-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.re…

AI模拟器

一、介绍 基于鸿蒙Next模拟一个ai对话过程二、场景需求 客户服务、数据分析、个性化推荐、图像和视频处理、智能家居、交通管理、教育行业、制造等等。 三、业务步骤 第一步:输入框提出问题,发送问题, 第二部:下次发送&#xff0…

实现BeanPostProcessor

文章目录 1.实现初始化方法1.目录2.InitializingBean.java3.MonsterService.java 实现初始化接口4.SunSpringApplicationContext.java 调用初始化方法5.测试 2.实现后置处理器1.目录2.BeanPostProcessor.java 后置处理器接口3.SunBeanProcessor.java 自定义后置处理器4.SunSpri…

萌啦数据怎么选品,萌啦数据ozon选品怎么选

在当今电商领域,数据已成为商家决策的重要基石。尤其是在跨境电商的广阔舞台上,如何借助数据分析工具精准选品,直接关系到商家在激烈竞争中的生存与发展。萌啦数据,作为业界知名的电商数据分析平台,凭借其强大的数据整…

DHCP协议-CSP认证

文章目录 DHCP协议 DHCP协议 stringstream的用法 应用实践 #include<bits/stdc.h>using namespace std;signed main() {string s"wo shi wwl, also wlw";stringstream ss;ss<<s;while(ss>>s){if(s[s.size()-1],) s[s.size()-1] ;cout<<s<…

128-域横向移动IPCATSC命令Impacket套件CS插件全自动

因为只有一台云服务器而且开不起台多的虚拟机只能只用几台进行演示&#x1f62d;&#x1f62d;&#x1f62d; 小迪的环境 上线之后先做的事情&#xff1a; IPC方式进行横向移动 at schtasks 他这里第三条命令有问题换成这个可以执行 schtasks /create /s 172.16.3.128 /U a…

证书学习(二)搞懂 keystore、jks、p12、pfx、crt、csr、pem文件的区别

目录 一、背景二、文件格式的区分2.1 .keystore / .jks 文件2.2 .p12 / .pfx 文件2.3 .crt 文件2.4 csr 文件2.5 .pem 文件 三、总结 一、背景 我们在日常的开发过程中&#xff0c;经常会见到各种各样的证书相关类型的文件&#xff0c;错综复杂。 其实 keystore、jks、p12、p…

濮阳示范区党工委书记杨行玉一行莅临超维机器人参观考察

8月20日&#xff0c;濮阳示范区党工委书记杨行玉带队赴郑州开展招商活动&#xff0c;并莅临超维机器人参观考察。此次考察旨在加快濮阳示范区产业升级步伐&#xff0c;推动高科技项目引进和落地&#xff0c;为区域经济高质量发展注入新动能。区三级调研员张立春、区招商局负责人…

外挂系统 -减少SAP用户许可数, 多点操作及时同步SAP

用过SAP 的人都知道SAP 是按照用户数来计算项目费用和年维护费的,所以很多公司设置了共同账号,外挂程序,WDA程序等,各种各样的规避方式。 当然SAP 标准的功能也相对简单化,要实现一些自定义的功能来满足各企业实际业务,那需要进行二次开发,有些顾问公司则通过在SAP 中开…

云计算实训33——高并发负载均衡项目(eleme)

一、配置一主两从mysql服务器&#xff08;mysql5.7&#xff09; 1.主服务器master 下载mysql5.7的包 [rootMysql ~]# rz -E rz waiting to receive. [rootMysql ~]# ls anaconda-ks.cfg mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz #解压 [rootMysql ~]# tar -zxf mysql-5…

用TensorFlow实现线性回归

说明 本文采用TensorFlow框架进行讲解&#xff0c;虽然之前的文章都采用mxnet&#xff0c;但是我发现tensorflow提供了免费的gpu可供使用&#xff0c;所以果断开始改为tensorflow&#xff0c;若要实现文章代码&#xff0c;可以使用colaboratory进行运行&#xff0c;当然&#…

ZooKeeper入门及核心知识点整理

什么是Zookeeper Zookeeper简称zk&#xff0c;先从字面意思上去理解&#xff0c;那就是动物园管理员。其实zk是大数据领域中的一员&#xff0c;为整个分布式环境提供了协调服务&#xff0c;主要可以用于存储一些配置信息&#xff0c;同时也可以基于zk实现集群。它是一个apache…

RabbitMQ的基础概念介绍

MQ的三大特点&#xff1a;削峰、异步、解耦 1.RabblitMQ概念介绍 1.1概念 RabbitMQ是由erlang语言开发&#xff0c;基于AMQP&#xff08;Advanced Message Queue 高级消息队列协议&#xff09;协议实现的消息队列&#xff0c;它是一种应用程序之间的通信方法&#xff0c;消息…

【docker】使用docker-compose的时候如何更新镜像版本

使用docker-compose的时候如何更新镜像版本。之前总是会忘记怎么操作&#xff0c;每次都得百度搜&#xff0c;干脆记录一下。 说明 我有一个memos是用docker-compose部署的&#xff0c;memos更新的挺频繁的&#xff0c;新版本的功能也不错&#xff0c;更新一下没啥问题。 注…

吴恩达机器学习课后作业-03多分类、神经网络前向传播

这里写目录标题 逻辑回归解决多分类问题&#xff08;逻辑回归的“一对多”&#xff08;One-vs-All&#xff09;策略。&#xff09;绘制图像结果 神经网络前向传播数字识别 、 逻辑回归解决多分类问题&#xff08;逻辑回归的“一对多”&#xff08;One-vs-All&#xff09;策略。…

[Algorithm][综合训练][孩子们的游戏][大数加法][拼三角]详细讲解

目录 1.孩子们的游戏1.题目链接2.算法原理详解 && 代码实现 2.大数加法1.题目链接2.算法原理详解 && 代码实现 3.拼三角1.题目链接2.算法原理详解 && 代码实现 1.孩子们的游戏 1.题目链接 孩子们的游戏 2.算法原理详解 && 代码实现 问题抽象…