DDD领域驱动设计系列-原理篇-战略设计

news2024/11/29 12:37:53

概述

DDD领域驱动设计是架构方法论,适用于业务逻辑较复杂系统。

DDD核心目的能输出领域如何划分,以及架构分层如何构建。

本文章系列会分2部分讲述DDD:1、DDD原理;2、DDD实践。DDD原理分为战略及战术设计2篇来讲述;

架构的本质上就是通过定义不同组件及组件间的关系实现高扩展性,可维护性,控制复杂度(手段);最终通过架构来实现高效迭代(目的);比如一个支付渠道的接入是否能影响最小的组件实现扩展。

而DDD通过战略设计来划分出业务域以及定义不同域间的关系;这样相同域的业务需求能在一个业务域完成而不会影响到其它域,无论从开发&测试&部署维度都能影响最小。

DDD通过战述设计来找出实体,聚合,聚合根,以及确定架构分层:Clean架构,CQRS等。

原理篇整体以战略设计及战术设计做为2大章节来叙述。

战略设计

目的

产出领域模型,领域的划分,定义核心域,通用域,支撑域。最终实现:控制业务架构复杂度,提供高扩展&可维护性,从而提升业务迭代效率

概念

领域:企业要做事情集合。包含了业务流程,角色。如结算域就是一个领域,结算域涉及很多业务流程:如运营设置费用项,商家入驻生成结算合同,交易确认收货进行结算给平台及结算给商户。

子域:领域的细分。细分的目的是为了控制复杂度。如结算又可根据结算阶段分为收单,计费等子域。

核心域:企业核心能力,需要投入重点资源来跟进;比如电商中交易,供应链,支付。

通用域如用户权限域,通用域可供不同业务使用。

支撑域:电商中的服务,在垂直电商刚起步时,服务可以做为支撑域采用采购形式让业务整体能run起来。后续根据业务发展,服务变成关键要素,此时服务再提升为核心域投入重点资源进入升级。

限界上下文是业务的边界。包含若干领域或子域。在业务边界内同一个实体拥有同一个语义。原则上限界上下文必须包含完整的业务流程。如结算中的计费子域对应一个限界上下文,其中包含了运营设置计费项以及后续确认收货后计费业务流程。

怎么划分

1、领域模型确定

通常使用事件风暴来进行,如结算业务中,事件风暴如下。

2、限界上下文划分

根据领域模型业务职责分类及相关性,最终能形成计费,清算,结算,合同限界上下文;

费用项&计费单合到计费限界上下文。why?本质上费用项及计费单都是做的计费的业务事情。费用项是计费的基础。反过来如果费用项拆到其它限界上下文会发现计费的这个需求会涉及到2个域,增加了协同成本。

由于商家与财务视角看到的计费项不同,所以以商家视角单拆出清算限界上下文。

结算单对应到结算限界上下文中,这中间的语义有结算单:核心定义给商家在什么时候结算多少钱。打款单对应到打款限界上下文,对应一笔实际与出资渠道对应的一条打款流水单。

3、由限界上下文再合并成子域

计费上下文形成计费子域。合同上下文则形成结算合同子域。清算限界上下文形成清算子域。

结算及打款合成一个结算子域:结算单与打款单需要高频协同因此从团队协作上及代码维扩展上放在一个子域。

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

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

相关文章

TCP/IP的体系结构

目录 一、TCP/IP的体系结构 二、TCP/IP四层协议的表示方法举例 三、现在因特网使用的TCP/IP体系结构 四、互联网应用层的客户——服务器方式 一、TCP/IP的体系结构 二、TCP/IP四层协议的表示方法举例 三、现在因特网使用的TCP/IP体系结构 四、互联网应用层的客户——服务器…

CSK6环境搭建

前期准备 开发板测试 (1)根据这个视频教程来进行测试:示例工程快速上手 Ubuntu环境搭建 (1)聆思官方推荐使用Linux开发,因此我于是采用VMware搭建Ubuntu的方式进行开发。不清楚Ubuntu搭建的请看&#xff1…

Linux——缓冲区与实现C库的fopen,fwrite,fclose

目录 一.缓冲区 1缓冲区的概念 2.缓冲区存在的意义 3.缓冲区刷新策略 4.什么是刷新? C语言的缓冲区在哪里? ​编辑 仿写C库里的fopen,fclose,fwrite。 mystdio.h mystdio.c main.c(向文件中写入20次msg) 一.缓冲区 1…

stack容器

stack容器 文章目录 stack容器一、头文件二、stack基本概念三、stack常用接口 一、头文件 #include <stack>二、stack基本概念 概念: stack是一种先进后出(First In Last Out,FILO)的数据结构&#xff0c;它只有一个出口 栈中只有顶端的元素才可以被外界使用&#xff0…

C++『异常』

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; C修行之路 &#x1f383;操作环境&#xff1a; Visual Studio 2022 版本 17.6.5 文章目录 &#x1f307;前言&#x1f3d9;️正文1.异常基本概念1.1.C语言异常处理方式1.2.C异常处理方式 2.异常的使用2.1.异常…

perl单行命令统计项目中代码单行过长的信息

项目中单行代码太长是不便于阅读和维护的&#xff0c;这里用perl单行命令实现项目中的单行过长的代码信息统计&#xff0c;方便修改。为方便说明&#xff0c;这里以一个开源项目为例&#xff0c;github链接evpp。以commit id 477033f938fd47dfecde43c82257cd286d9fa38e 为例&am…

陀螺仪LSM6DSV16X与AI集成(4)----Qvar触摸电容配置

陀螺仪LSM6DSV16X与AI集成.4--Qvar触摸电容配置 概述视频教学样品申请源码下载生成STM32CUBEMX串口配置IIC配置CS和SA0设置串口重定向参考程序初始换管脚获取ID复位操作BDU设置Qvar 功能的实现和配置设置量程和速率配置过滤链激活 Qvar 功能获取Qvar数据演示 概述 Qvar&#x…

2-5、包含多个段的程序

语雀原文链接 文章目录 1、概述2、代码段中使用数据示例1&#xff1a;不指定程序入口示例2&#xff1a;指定程序入口原理梳理 3、在代码段中使用栈例子1例子2 4、数据、代码、栈放入不同的段例子1&#xff1a;end start指定程序入口第一步&#xff1a;设置栈顶第二步&#xff…

Golang channle(管道)基本介绍、快速入门

channel(管道)-基本介绍 为什么需要channel&#xff1f;前面使用全局变量加锁同步来解决goroutine的通讯&#xff0c;但不完美 1)主线程在等待所有goroutine全部完成的时间很难确定&#xff0c;我们这里设置10秒&#xff0c;仅仅是估算。 2)如果主线程休眠时间长了&#xff0c…

tgf - 一个开箱即用的golang游戏服务器框架

tgf框架 tgf框架是使用golang开发的一套游戏分布式框架.属于开箱即用的项目框架,目前适用于中小型团队,独立开发者,快速开发使用.框架提供了一整套开发工具,并且定义了模块开发规范.开发者只需要关注业务逻辑即可,无需关心用户并发和节点状态等复杂情况. 使用介绍 创建业务逻辑…

m1通过源码编译xgboost4j的jar

1、下载源码 git clone --recursive https://github.com/dmlc/xgboost cd xgboost 编译xgboost的动态链接库dylib&#xff0c;m1源码编译xgboost的动态链接库dylib文件 2、编译XGBoost的jar文件&#xff1a; A、如果没有安装maven可以通过以下命令进行安装&#xff0c;如果安…

邮件营销软件:10个创新邮件营销策略,提升投资回报率(一)

电子商务和电子邮件营销密不可分。尽管电子商务在蓬勃发展&#xff0c;而很多人对邮件营销颇有微词。但是在电子商务中&#xff0c;邮件营销的确是一种有效营销方式。在本文中&#xff0c;我们将讨论一下邮件营销在电子商务中的有效运用&#xff0c;帮助您的企业在今年尽可能地…

045:Vue读取本地上传JSON文件,导出JSON文件方法

第045个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

HibernateJPA快速搭建

1. 先创建一个普通Maven工程&#xff0c;导入依赖 <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><depe…

windows 10多用户同时远程登陆配置【笔记】

系统环境&多用户访问情况&#xff1a; 1、【win】【R】键入【gpedit.msc】 2、依次选择【计算机配置】→ 【管理模板】 → 【Windows组件】 → 【远程桌面服务】 → 【远程桌面会话主机】 →【连接】 2.1、右键 【允许用户通过使用远程桌面服务进行远程连接】 编辑 …

Go语言基础知识学习(一)

Go基本数据类型 bool bool型值可以为true或者false,例子&#xff1a; var b bool true数值型 类型表示范围int8有符号8位整型-128 ~ 127int16有符号16位整型-32768 ~ 32767int32有符号32位整型-2147783648 ~ 2147483647int64有符号64位整型uint8无符号8位整型0 ~ 255uint16…

linux通过命令切换用户

在Linux中&#xff0c;你可以使用su&#xff08;substitute user或switch user&#xff09;命令来切换用户。这个命令允许你临时或永久地以另一个用户的身份运行命令。以下是基本的用法&#xff1a; 基本切换到另一个用户&#xff08;需要密码&#xff09;&#xff1a;su [用户…

C# 静态构造函数与类的初始化

静态构造函数&#xff1a; 基本概念&#xff1a; 静态构造函数用于初始化任何静态数据。 静态构造函数的常见特性&#xff1a; 静态构造函数不使用访问修饰符或不具有参数。因为静态构造函数由系统调用&#xff0c;无法人为调用&#xff0c;所以就不存在public、private等。…

Gazebo 跟踪8字形和U形轨迹(1) — 错误处理

Gazebo 跟踪8字形和U形轨迹(1) — 错误处理 整个过程还是比较曲折的&#xff0c;主要都是一些细小的问题&#xff0c;跑了很多遍模型才发现 参考轨迹生成问题不大&#xff0c;主要是参考横摆角和参考曲率部分有问题 atan和atan2 首先看下两者的区别 atan 函数&#xff1a;…

智能监控型电源老化房方案

电源适配器专用老化房主要适用于充电器等电源成品&#xff08;半成品&#xff09;作一般性老化测试。其负载主体采用程控式电子负载&#xff0c;保证其稳定度和可调节性。该老化车配备电脑操作监控系统。 模拟量采集/老化房采集软件 一、老化房功能&#xff1a; 1 负载主体&am…