一篇带你快速入门DDD领域驱动设计

news2024/12/26 0:15:12

一、什么是领域驱动

领域驱动设计 Domain-Driven Design,简称DDD。软件对于行业并没有这么高的要求,他本身就是帮助其他行业更好的发展,赋能其他行业的。各个行业都有软件的身影,但是他们的业务场景是不同的,所以就需要大量的业务梳理。可能需要专门的人来梳理,就是产品经理。

我们的开发需求可能是运营到产品再到架构,最后才给到我们开发人员,经过层层传递,可能最初运营的方案和落到开发人员的方案是完全不一样的。最终所做出来的东西和运营要的可能不一样。

早期我们的领域模型可能就是数据库设计,根据业务直接建表,然后根据表的情况来进行对象映射,我们的设计流程就是建表到反推对象。这个情况如果业务进行变更,耦合度会增加,也不会满足越来越快的开发节奏。在原本的瀑布式开发是可以的,但现在互联网进入了快节奏,敏捷开发,整个项目周期都可能是实验阶段,需求随时变更。

所以我们就得用更抽象的东西来做领域建模, 领域驱动设计分为概念设计、逻辑设计、物理设计三个阶段。概念设计是概念关联图,概念类,领域类图,填充属性等。逻辑设计主要是业务罗家集和业务模型。物理设计,物理选型,可能会推翻上面理论重新定义,数据存储问题,等等。

二、领域驱动和微服务

2004年,Eric Evans发表《领域驱动设计》并且确定了领域驱动设计的核心思想:

即通过领域驱动设计方法定义领域模型,从而确定业务和应用边界,保证业务模型与代码模型的一致性。

但是提出这个概念后,DDD非常的火,但是一直没有落地的方案。直到2015年springcloudd1.0.0正式发布,springcloud netflix 2016年出现了第一个Release版本,从此一发不可收拾。

微服务的"微"到底怎么拆呢,一个多小?

这个时候领域驱动设计就起到作用了,通过领域驱动设计来划分领域模型,根据领域边界从业务角度进行微服务划分。现在很多公司已经把领域驱动设计当做微服务的指导思想了。

领域驱动用什么方式进行边界定义?

1、战略设计:从业务角度出发,建立业务模型,划分业务边界

2、战术设计:根据业务模型进行技术实现,完成软件的开发以及落地

三、DDD常见概念

1、领域

一个领域本质可以理解为就是一个问题域,只要是同一个领域,那问题域就相同。

例如:传统电商领域的问题无非订单,商品,物流,支付,库存等等,绝对不会设计到如出行,政法等相关问题,社交电商除了会有传统的电商属性外,也会附带上社交,通讯相关的功能。

2、子域

子域:你可以理解为更加细分的领域,甚至可以把子域进行更加细分,分成更多子域。

例如:电商平台看成一个领域吗,订单,仓储,物流都可以是子域,而仓储还可以划分为本地存储,三方仓库,异地仓库等。这些都可以看成是子域。

核心子域:整个业务系统的核心,所有业务都要围绕核心子域展开。

通用子域:整个领域都能够用到的子域,认证授权等模块。

支撑子域:支撑域实际上就是不包括核心竞争力的功能和通用的功能,但又是必须的支撑。

3、通用语言

一个项目中,技术专家,架构师,后端,前端,测试都会参与,但是对话的时候,可能你作为后端你会感觉产品根本get不到你的点,产品也觉得你get不到他,会出现鸡同鸭讲的问题。这时候必须有个统一的通用语言出来统一标准,能够正确简单清晰的表达业务逻辑,让项目中每个人员都能达成共识的语言。

4、限界上下文

用来封装通用语言和领域对象,提供上下文环境,保证在领域内的一些术语、业务相关对象等通用语言有一个确切的含义,没有二义性。这个边界定义了模型的适用性。

四、领域模型

也叫业务对象模型,描述业务对象之间的引用关系的。

业务对象:3种

  • 业务角色:收银员,职责:计算商品价格,收钱,找零,退换货
  • 业务实体:与业务角色交互需要的可交付的工件,电商项目中的商品,发票。
  • 业务用例:业务角色和业务实体之间如何执行工作流程

失血模型:对象中只包含属性和get和set方法,优点就是简单,缺点所有的业务逻辑都包含在service里面是全部的业务代码,难以维护,无法应对频繁变化的需求。

贫血模型:在失血模型的基础上加上了持久层,不用在业务层去访问数据库,直接操作持久成间接的操作数据库,然后也包含一些固有行为(People的走路,吃饭,睡觉),非固有行为(people的:敲代码,打游戏,做算法题等,这些不是人人都会的)就写到service里面。优点:层次结构清楚,各层级单向依赖,对于少量业务应用来说,使用起来非常自然,开发迅速。缺点:无法应对非常复杂的场景。(用得最多)

充血模型:更符合面向对象原则,将固有行为和非固有行为全部包含在了模型当中,我们的业务层只会做整合和封装的作用,业务逻辑层很薄,符合咱们单一职责原则。缺点:开发者的水平要很高,模型中包含1大量操作,你去实例化的时候,增加很多不必要的消耗。

胀血模型:取消掉了service层,所有业务逻辑的整合都放在了领域模型中,简化了分层架构,也算是符合面向对象设计原则,取消了业务逻辑层,直接在domain object封装事务和授权,可能会授权很多原本不属于这个领域对象的逻辑,从而影响模型不稳定。代码的稳定性和维护的稳定性。

五、DDD分层架构设计

传统的三层架构

领域驱动为了更好贴近业务落地,也有自己的架构设计方法论。传统的三层模型重点在数据库,所以会以数据库作为分析的基点。而领域驱动设计的重点在领域模型,所以会以他来做分析基点。

用户界面层,显示信息给用户,对外的model,这个model不是领域层的model,会用装配器转换为应用层的model。有个箭头,是可以直接访问领域层的

应用层,规定了领域要完成的任务,与模型进行与实体无关的业务逻辑。

领域层,表达业务概念,业务信息的状态,业务规则

基础设施层,为上面层提供交互层次

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

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

相关文章

【MYSQL】数据类型和约束

目录 数据类型 1.数值类型 1.1.位--类型bit(M) 1.2. 整数类型--tinyint,smallint,int,bigint 1.3.小数类型--float、decimal 2.字符类型--char、varchar 3.日期类型--datetime、timestamp 4.string类型--enum和set mysql的约束 1.空…

Mybatis 知识总结2(基于注解的增删改查操作)

3.3 MyBatis 增删改查(注解方式) MyBatis 的增删改查是最基础最核心的功能,需要重点掌握。 需求说明 对员工信息进行增删改查操作。 查询(查询结果分页展示后续实现) 根据主键ID查询根据条件查询 新增更新删除 根据主…

海思芯片(hi3536av100)启动模式选择

1、支持多种模式可配置 (1)支持BootRom启动 (2)支持从 SPI NOR Flash 启动 (3)支持从 SPI NAND Flash 启动 (4)支持从 eMMC 启动 (5)支持 PCIe 从片启动 2、启动方式的选择 BOOT_SEL[1:0]SFC_EMMC_BOOT_MODEMODE000SPI Nor Flash 3 Byte001SPI Nor Flash 4 Byte010SPI Nand Fl…

2005-2020全国及各省家庭承包耕地流转总面积及经营耕地面积

2005-2020全国及各省家庭承包耕地流转总面积及经营耕地面积 1、时间:时间:2005-2020年 2、范围:包括全国及30个省份不包括西藏 3、指标包括:家庭承包耕地流转总面积(亩)、家庭承包经营耕地面积(亩) 4、来源:农村经…

荔枝派Zero(全志V3S) tftp下载 kernel 和 nfs 挂载文件系统

文章目录 前言一、U-Boot 适配 Ethernet1、配置 U-Boot2、修改 dts 文件3、编译4、烧写到 SD 卡5、测试<1>、查看启动打印信息<2>、ping 测试 二、Kernel 适配 Ethernet1、配置 kernel2、修改 dts 文件3、编译4、拷贝到 SD 卡5、测试<1>、启动网络接口&#…

【嵌入式环境下linux内核及驱动学习笔记-(7-内核 I/O)-多路复用】

目录 2、多路复用2.1 函数select相关2.1.1 应用层select()2.1.2 FD_ZERO2.1.3 FD_SET2.1.4 FD_ISSET 2.2 函数poll相关2.2.1 poll函数 2.3 驱动层 函数2.4 实例 接上篇&#xff0c;继续内核 I/O的五种模式的解读。 2、多路复用 select&#xff0c;poll&#xff0c;epoll都是IO…

常见的接口优化技巧思路

一、背景 针对老项目&#xff0c;去年做了许多降本增效的事情&#xff0c;其中发现最多的就是接口耗时过长的问题&#xff0c;就集中搞了一次接口性能优化。本文将给小伙伴们分享一下接口优化的通用方案。 二、接口优化方案总结 1.批处理 批量思想&#xff1a;批量操作数据…

windows如何确认服务器上程序端口是否正常

方式1&#xff1a;ping命令 ping命令说明 ping命令是个使用频率极高的网络诊断工具&#xff0c;在Windows、Unix和Linux系统下均适用。它是TCP/IP协议的一部分&#xff0c;用于确定本地主机是否能与另一台主机交换数据报。根据返回的信息&#xff0c;我们可以推断TCP/IP参数设…

类和对象 -上(C++)

目录 认识面向过程和面向对象 类的引入 类的定义 语法&#xff1a; 类的两种定义方式&#xff1a; 成员变量命名规则建议 类的访问限定符及封装 访问限定符 C 中 class 和 struct 的区别&#xff1f; 封装 类的作用域 类的实例化 类对象模型 如何计算类对象的大小 结构体的内存…

想保护你的网站?用Python来生成验证码图片

前言 随着互联网的发展&#xff0c;我们越来越多地依赖于网站和应用程序&#xff0c;而这些网站和应用程序也面临着各种各样的安全威胁&#xff0c;其中之一就是用户可能会通过脚本攻击你的网站。为了缓解这些安全风险&#xff0c;一个常见的做法是在用户进行操作时&#xff0…

关于电信设备进网许可制度若干改革举措的通告

Q&#xff1a;3月1日后&#xff0c;不再实行进网许可管理的11种电信设备是否还需要继续申请和使用标志&#xff1f; A&#xff1a;3月1日起&#xff0c;对不再实行进网许可管理的11种电信设备停止核发进网许可标志&#xff0c;已申请的标志可在证书有效期内继续使用。 Q&#…

应用启动时aerospike客户端查询rt高原因

在应用刚起步时&#xff0c;发到预发测试或者生产小部分流量进来时&#xff0c;发现aerospike的rt特别高&#xff0c;在流量稍微大点时&#xff0c;rt恢复正常。基本可以断定客户端存在预热问题。 应用没有设置连接池配置&#xff0c;因此check下默认配置 可以看到&#xff0…

c++类 笔记(陆续更新该文档)

派生类 #include <iostream> using namespace std; class Box{private://类私有&#xff0c;只有成员可以调用 也就是说你不可以通过box1.a来调用 ,这些变量其实你默认不用写private 这个变量&#xff0c;只要放在最上面他默认就是 私有int a1;protected://protected&am…

AlgoC++:课程总结

目录 课程总结前言1. 未讲解内容2. 复习2.1 矩阵求导2.2 优化方法2.3 具体的算法 3. 未来怎么学C(必看&#xff01;&#xff01;&#xff01;) 课程总结 前言 手写AI推出的全新面向AI算法的C课程 Algo C&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考。 本次课…

【嵌入式环境下linux内核及驱动学习笔记-(8-内核 I/O)-信号驱动】

目录 3 信号驱动的异步通知3.1 linux异步通知编程3.1.1 什么是信号3.1.2 信号的工作流程: 3.2. 应用层3.2.1 信号接收 signal函数3.2.2 应用层 fcntl 函数3.2.3 应用层信号驱动机制步骤 3.3 驱动层3.3.1 驱动层模板3.3.2 驱动层 实现fasync函数3.3.3 fasync_helper3.3.4 struct…

Golang-常见数据结构Slice

Slice slice 翻译成中文就是切片&#xff0c;它和数组&#xff08;array&#xff09;很类似&#xff0c;可以用下标的方式进行访问&#xff0c;如果越界&#xff0c;就会产生 panic。但是它比数组更灵活&#xff0c;可以自动地进行扩容。 了解 slice 的本质, 最简单的方法就是…

MySQL 一条SQL语句是如何执行的?

总览 ​ 所以今天我们把MySQL拆解一下&#xff0c;看看里边有哪些零件。下边是MySQL的基本架构示意图。 大体来说&#xff0c;MySQL分为Server层和存储引擎两部分。 Server 层包括连接器、查询缓存、分析器、优化器、执行器等&#xff0c;涵盖 MySQL 的大多数核心服务功能&am…

小白也能懂的可转债配债价格计算

可转债配债如何计算 先给理论公式&#xff1a; 配债10张/1手所需的钱数 配债所需股数 * 当前的股价 这个公式应该很好理解&#xff0c;不需要做过多的解释。 那&#xff0c; 为什么如此简单的公式&#xff0c;还是很多人不会算&#xff0c;是因为&#xff1a; 配债所需的股数跟…

类与对象之构造函数

文章目录 导读类的6个默认构造函数构造函数概念特性 析构函数概念特性 拷贝构造函数概念特性 赋值运算符重载运算符重载赋值运算符重载前置和后置重载 导读 本文是md导入的可能格式有点乱&#xff0c;希望各位理解一下 类的6个默认构造函数 默认成员函数&#xff1a;用户没有…

五一堵车 | AI“高速”车辆检测轻而易举监测大家安全

点击蓝字关注我们 关注并星标 从此不迷路 计算机视觉研究院 学习群&#xff5c;扫码在主页获取加入方式 计算机视觉研究院专栏 作者&#xff1a;Edison_G 五一节不管是离开小城镇还是进入大城市&#xff0c;每个高速路口都是堵车&#xff0c;现在人工智能愈来愈发达&#xff0c…