领域驱动设计(Domain-Driven Design, DDD)

article/2025/6/24 2:28:15

 

博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌

博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+MySQL+Vue等前后端分离项目,可以在左边的分类专栏找到更多项目。《Uniapp项目案例》有几个有uniapp教程,企业实战开发。《微服务实战》专栏是本人的实战经验总结,《Spring家族及微服务系列》专注Spring、SpringMVC、SpringBoot、SpringCloud系列、Nacos等源码解读、热门面试题、架构设计等。除此之外还有不少文章等你来细细品味,更多惊喜等着你哦

🍅uniapp微信小程序🍅面试题软考题免费使用,还可以使用微信支付,扫码加群。由于维护成本问题得不到解决,可能将停止线上维护。

🍅文末获取联系🍅精彩专栏推荐订阅👇🏻👇🏻 不然下次找不到哟

Java项目案例《100套》
https://blog.csdn.net/qq_57756904/category_12173599.html
uniapp小程序《100套》

https://blog.csdn.net/qq_57756904/category_12173599.html

有需求代码永远写不完,而方法才是破解之道,抖音有实战视频课程,某马某千等培训都是2万左右,甚至广东有本科院校单单一年就得3万4年就12万学费,而且还没有包括吃饭的钱。所以很划算了。另外博客左侧有源码阅读专栏,对于求职有很大帮助,当然对于工作也是有指导意义等。在大城市求职,你面试来回一趟多多少少都在12块左右,而且一般不会一次性就通过,还得面试几家。而如果你对源码以及微服务等有深度认识,这无疑给你的面试添砖加瓦更上一层楼。

最后再送一句:最好是学会了,而不是学废了!!

2

领域驱动设计(Domain-Driven Design, DDD)

DDD 不仅仅是一套技术或模式,它更是一种思维方式和一套设计原则,旨在应对复杂软件系统(尤其是业务系统)开发中的核心挑战:将业务领域的复杂性与软件实现紧密、有效地结合起来

它的核心思想是:软件系统的结构、语言和行为应该深刻反映并专注于其核心业务领域。

DDD 诞生的背景和要解决的问题

  1. 沟通鸿沟: 业务专家(领域专家)和开发人员使用不同的语言和思维模式,导致需求理解偏差、设计偏离业务本质。

  2. 模型与实现脱节: 设计文档中的“理想模型”与实际代码结构差异巨大,导致维护困难,代码难以反映业务变化。

  3. 软件复杂度失控: 当业务逻辑分散在数据库、UI、服务层等各处时,系统变得难以理解和修改。

  4. 无法有效应对变化: 业务需求变化时,修改代码牵一发而动全身,成本高昂且风险大。

DDD 的核心概念与组成部分

DDD 可以分为战略设计战术设计两大支柱:

一、战略设计:关注高层次的组织结构和边界划分

  1. 统一语言(Ubiquitous Language):

    • 核心理念! 项目团队(包括领域专家、开发、测试、产品等)共同创建一套精确的、无歧义的、基于业务领域的词汇表。

    • 这套语言贯穿于需求讨论、设计文档、代码实现(类名、方法名、变量名)、测试用例等所有环节。

    • 目标: 消除沟通障碍,确保所有人对业务概念的理解完全一致,代码就是领域模型最直接的表达。

  2. 限界上下文(Bounded Context):

    • 关键战略模式! 大型复杂领域会被分解成若干个较小的、内聚的、语义清晰的子领域(Subdomain)。每个子领域对应一个限界上下文

    • BC 定义了:

      • 一个明确的边界,在这个边界内,特定的统一语言具有特定的、一致的含义。

      • 一个领域模型的有效范围和生命周期。

    • 类比: 就像生物体的细胞,每个细胞(BC)有自己的职责和内部环境(模型),并通过细胞膜(边界)与其他细胞进行清晰、受控的交互。

    • 重要性: 防止模型概念在不同上下文中的含义混淆(例如,“客户”在销售上下文和财务上下文中含义可能不同),是微服务拆分的重要依据。

  3. 上下文映射图(Context Mapping):

    • 描述不同的限界上下文之间如何交互和集成的图。

    • 定义了交互模式(如:合作关系、客户方-供应方开发、遵奉者、防腐层、开放主机服务、发布语言、分离方式等)。

    • 目标: 清晰展示系统整体结构,管理跨边界的依赖和集成复杂性。

  4. 核心域、支撑域、通用域(Core Domain, Supporting Subdomain, Generic Subdomain):

    • 核心域: 是整个系统的核心竞争力所在,是业务差异化的关键,需要投入最多的精力和最优秀的人才进行深度建模和创新。

    • 支撑域: 为核心域提供必要的支持功能,对业务很重要但不是核心竞争力(如:报表、特定工作流)。可以投入较少资源或考虑购买/外包方案。

    • 通用域: 非常通用、行业标准化的功能(如:身份认证、日志、通知)。通常建议使用现成的、成熟的解决方案(库、框架、SaaS),避免重复造轮子。

    • 目标: 帮助团队识别战略重点,合理分配资源。

二、战术设计:关注如何在限界上下文内部构建领域模型和实现细节

  1. 实体(Entity):

    • 具有唯一标识符(ID)和生命周期(会经历创建、修改、删除)的对象。

    • 标识符是其身份的核心,即使属性发生变化,只要ID不变,就还是同一个实体。

    • 例子: Customer (有唯一的 CustomerID), Order (有唯一的 OrderID)。

  2. 值对象(Value Object):

    • 描述事物的特征(属性),但没有概念上的标识符或生命周期。

    • 其相等性基于所有属性的值是否相等。

    • 通常是不可变(Immutable) 的。修改意味着创建一个新的值对象实例。

    • 例子: Money (包含 Amount 和 Currency), AddressColor

  3. 聚合(Aggregate)与聚合根(Aggregate Root):

    • 关键模式! 将一组强相关的实体和值对象组合成一个一致性边界

    • 聚合根(Aggregate Root): 聚合的入口点。外部只能通过聚合根来访问或修改聚合内部的对象。

    • 聚合根负责维护聚合内部的业务规则和不变量(在任何操作后都必须为真的条件)。

    • 聚合作为一个整体被加载和持久化(通常对应数据库的一个事务边界)。

    • 目标: 定义清晰的业务一致性边界,简化模型关系,控制对象访问,是事务设计的基础。

    • 例子: Order (聚合根) 包含多个 OrderItem (实体) 和一个 ShippingAddress (值对象)。修改 OrderItem 的数量必须通过 Order 进行,Order 会检查总金额等不变量。

  4. 领域服务(Domain Service):

    • 当某个重要的业务操作或规则无法自然地归属于某个实体或值对象时(通常是跨多个聚合的操作,或需要访问基础设施但本质是业务逻辑的操作),将其封装在领域服务中。

    • 服务应该是无状态的。

    • 例子: FundsTransferService (处理两个银行账户之间的转账逻辑,涉及两个 Account 聚合)。

  5. 领域事件(Domain Event):

    • 表示在领域内发生的、对业务有重要意义的事实(Fact)

    • 是过去时态(如:OrderPlacedPaymentReceivedInventoryAdjusted)。

    • 用于:

      • 解耦: 一个聚合执行操作后发布事件,其他聚合或限界上下文监听并作出反应。

      • 通知: 通知系统其他部分(如:发送邮件、更新视图模型)。

      • 审计/溯源: 记录系统状态变化的历史。

      • 实现最终一致性: 在分布式系统中协调跨聚合/上下文的数据变更。

  6. 仓储(Repository):

    • 提供对聚合根进行持久化和检索的接口(抽象)。

    • 客户端(如应用服务)通过仓储接口(如 IOrderRepository)获取聚合根(如 Order),操作聚合根,然后通过仓储保存更改。

    • 目标: 封装持久化细节(ORM, 数据库等),让领域层专注于业务逻辑,不依赖基础设施。

  7. 工厂(Factory):

    • 封装复杂对象或聚合的创建逻辑。当对象的构造过程本身很复杂(涉及多个步骤、规则验证)时使用。

    • 可以是独立的工厂类,也可以是聚合根上的工厂方法。

分层架构(常用)

DDD 项目通常采用分层架构来分离关注点:

  1. 用户界面层 / 表现层: 处理用户交互、展示数据、接收命令。可以是 Web API, MVC Controller, GUI 等。

  2. 应用层:

    • 协调领域对象和基础设施(如仓储)来完成一个特定的应用任务(用例/用户故事)。

    • 很薄,主要包含流程控制(调用领域服务、聚合根方法、发送命令、发布事件等)。

    • 不包含核心业务逻辑

  3. 领域层:

    • 核心! 包含业务概念、规则、状态(实体、值对象、聚合根、领域服务、领域事件)。

    • 是软件的核心价值所在,应该尽可能保持纯净(Persistence Ignorant),不依赖基础设施(数据库、网络、框架等)。

  4. 基础设施层:

    • 为上层提供技术实现细节:数据库访问(实现仓储接口)、消息队列、文件系统操作、邮件发送、框架配置等。

    • 领域层和应用层通过接口(抽象)依赖于基础设施层提供的具体实现。

DDD 的优势

  1. 提升沟通效率与质量: 统一语言打破了业务与技术之间的壁垒。

  2. 更贴合业务的软件设计: 软件结构直接映射业务核心,易于领域专家理解。

  3. 更高的可维护性和可扩展性:

    • 限界上下文和聚合提供了清晰的模块化边界。

    • 领域逻辑高度内聚,更容易定位修改点。

    • 更容易应对业务变化。

  4. 更好的设计质量: 战术模式(实体、值对象、聚合)引导开发者创建更清晰、更健壮的模型。

  5. 微服务设计的理想基础: 限界上下文天然地对应微服务的边界。

  6. 聚焦核心竞争力: 战略设计帮助团队识别并投入资源在核心域上。

DDD 的挑战与适用场景

  • 学习曲线陡峭: 概念多,需要思维转变,需要团队(尤其是领域专家)共同投入。

  • 前期成本较高: 深入领域建模、建立统一语言需要时间和精力。

  • 对领域专家要求高: 需要领域专家深度参与。

  • 不适用于简单 CRUD 系统: 如果业务逻辑非常简单,DDD 的复杂性可能是过度的。

  • 需要经验丰富的架构师/开发者引导: 避免过度设计或设计不当。

适用场景:

  • 业务逻辑复杂的系统。

  • 系统需要长期演进,对可维护性、可扩展性要求高。

  • 团队规模较大,需要清晰的模块化边界(限界上下文)。

  • 需要与领域专家紧密合作,确保软件准确反映业务需求。

  • 计划向微服务架构迁移。

总结

DDD 是一种以领域为中心、以模型为驱动、强调统一语言的软件设计方法学。它通过战略设计(限界上下文、上下文映射)管理大型系统的复杂性边界和交互,通过战术设计(实体、值对象、聚合、领域服务、事件等)在边界内构建高内聚、业务逻辑清晰的领域模型。

成功应用 DDD 能显著提升软件对业务的贴合度、可理解性、可维护性和应对变化的能力。但它不是银弹,需要评估项目的复杂度和团队的意愿能力来决定是否采用,并投入必要的学习成本和协作努力。

3


http://www.hkcw.cn/article/PqQuRjRSTs.shtml

相关文章

江科大RTC实时时钟hal库实现

首先&#xff0c;因为的LSE无法启振&#xff0c;所以我使用LSI当作RTCCLK,LSI无法由备用电源供电&#xff0c;故主电源掉电时&#xff0c;RTC走时会暂停。 hal库相关函数 时分秒 typedef struct {uint8_t Hours; /*!< Specifies the RTC Time Hour.This param…

从“人防”到“智防”,智驱力助力危化品企业智能化转型

化工和危险化学品企业一直是国家安全生产监管的重点领域之一。近年来&#xff0c;随着AI技术的快速发展&#xff0c;越来越多的传统工业场景开始引入人工智能技术&#xff0c;实现从“人防”向“技防”的转变。多地应急管理厅也相继出台相关政策&#xff0c;推动视频智能分析系…

Nacos 2.4.3 登录配置

1&#xff0c; 调整配置 完整配置文件 # # Copyright 1999-2021 Alibaba Group Holding Ltd. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy…

Cursor 0.51 全网首歌新功能深度体验:Generate Memories 让 AI 编程助手拥有“记忆“

写在前面 你是否遇到过这样的困扰:每次开启新的 Cursor 对话,都要重新向 AI 解释项目背景、技术栈、架构设计?或者当对话内容过多时,AI 就"忘记"了之前讨论的重要信息? 如果你有过这样的经历,那么 Cursor 0.51 版本新推出的 Generate Memories 功能绝对是你的…

如何在WHM中配置远程数据库访问

在远程数据库访问方面&#xff0c;cPanel和WHM之间存在一些差异&#xff1a; 在WHM中添加的主机将应用于所有cPanel用户帐户及其关联的MySQL用户。 cPanel用户无法永久删除由系统管理员root账户在WHM中添加的主机。 要允许远程主机访问MySQL数据库&#xff0c;请导航到侧边栏…

强大的PDF编辑工具,操作方便 ,长久使用

这是一款能够让每一个用户都能在这里轻松实现最简单的编辑方式&#xff0c;一站式完成PDF文件处理&#xff0c;较于前面几个版本&#xff0c;这个版本整体界面比较清爽&#xff0c;用户可以在这里一站式完成PDF编辑&#xff0c;在这里快速修改&#xff0c;编辑、创建、电子签名…

上海迪士尼游客打架官方通报 拍照冲突致肢体冲突

昨天21:45,浦东公安分局发布微博称,5月31日18时许接到报警,迪士尼乐园内发生打架事件。经初步调查,闫某某(男,22岁)与女友在拍照时,因刘某某(男,36岁)夫妻的女儿进入拍摄画面,双方发生口角后引发肢体冲突,造成闫某某和刘某某互有皮外伤,小女孩未受伤。目前,调查…

蔚来5月交付23231辆 同比增长13.1%

6月1日,蔚来公司公布了5月份的交付数据。当月共交付新车23231台,同比增长13.1%。具体来看,蔚来品牌交付了13270台;乐道品牌交付了6281台;firefly萤火虫品牌交付了3680台。截至目前,蔚来公司累计交付新车总数达到760789台。其中,蔚来品牌累计交付710655台;乐道品牌累计交…

沈白高铁进入开通运营倒计时 联调联试启动

6月1日,国家“十四五”规划重点高速铁路建设项目——沈阳至长白山高速铁路正式启动联调联试,标志着沈白高铁进入开通运营的倒计时。沈白高铁起自沈阳北站,途经辽宁省沈阳市、沈抚新区、抚顺市,以及吉林省通化市、白山市、延边州、长白山管委会,最终引入敦化至白河铁路长白…

台艺人刘乐妍称自己是中国人:反对"台独"是世界潮流,也是台湾唯一出路

六一发文称自己是中国人!台湾艺人刘乐妍:反对"台独"是世界潮流,也是台湾唯一出路!责任编辑:zx0002

Cesium使用primitive添加点线面(贴地)

// 创建一个图元集合const primitives viewer.scene.primitives.add(new Cesium.PrimitiveCollection());1、点上图 // 定义点的位置&#xff08;中国不同城市的经纬度&#xff09;const points [{ lon: 116.4074, lat: 39.9042, name: "北京" },{ lon: 121.4737, …

杨明洋社媒晒国足训练照 备战印尼全力以赴

国脚杨明洋更新了社交媒体,分享了自己随国足备战与印尼比赛的照片。国足目前在上海进行最后两场18强赛的备战工作,并计划于今日启程前往雅加达。杨明洋表示,首次入选国家队感到非常荣幸,能够成为其中一员对他来说意义重大。责任编辑:zx0176

警方通报上海迪士尼打架事件 拍照争执引发冲突

6月1日,浦东公安分局接到报警称,5月31日18时许迪士尼乐园内有人打架。经初步调查,闫某某(男,22岁)与女友在拍照时,因刘某某(男,36岁)夫妻的女儿进入拍摄画面,双方发生口角后引发肢体冲突,造成闫某某和刘某某互有皮外伤,小女孩未受伤。目前,调查处理工作正在进一步…

机器视觉图像处理之图像滤波

1.均值滤波 均值滤波是一种基本的线性图像滤波方法&#xff0c;主要用于图像平滑和噪声去除。 特点 优点&#xff1a; 算法简单&#xff0c;计算速度快 对高斯噪声有较好的去除效果 能有效平滑图像中的小波动 缺点&#xff1a; 会导致边缘模糊 对椒盐噪声(脉冲噪声)效果不…

8、电解电容—数据手册解读

目录 1、寿命 2、Rated Voltage 额定电压(VR) 3、Capacitance 额定容量(CR) 4、Surge Voltage 浪涌电压(VS) 5、Leakage Current 泄漏电流(ILC) 6、Dissipation Factor (Tanδ)损失角正切值 7、Ripple Current 纹波电流(IRC, rms) 8、参数特性 9、寿命计算 9.1 以江海为例&…

Python----目标检测(《YOLOv3:AnIncrementalImprovement》和YOLO-V3的原理与网络结构)

一、《YOLOv3:AnIncrementalImprovement》 1.1、基本信息 标题&#xff1a;YOLOv3: An Incremental Improvement 作者&#xff1a;Joseph Redmon, Ali Farhadi 机构&#xff1a;华盛顿大学&#xff08;University of Washington&#xff09; 发表时间&#xff1a;2018年 代…

ck-editor5的研究 (5):优化-页面离开时提醒保存,顺便了解一下 Editor的生命周期 和 6大编辑器类型

前言 经过前面的 4 篇内容&#xff0c;我们已经慢慢对 CKEditor5 熟悉起来了。这篇文章&#xff0c;我们就来做一个优化&#xff0c;顺便再补几个知识点&#xff1a; 当用户离开时页面时&#xff0c;提醒他保存数据了解一下 CKEditor5 的 六大编辑器类型了解一下 editor 实例对…

unity开发棋牌游戏

使用unity开发的棋牌游戏&#xff0c;目前包含麻将、斗地主、比鸡、牛牛四种玩法游戏。 相关技术 客户端&#xff1a;unity 热更新&#xff1a;xlua 服务器&#xff1a;c Web服务器&#xff1a;ruoyi 游戏视频 unity开发棋牌游戏 游戏截图

2025GDCPC广东省赛游记(附赛时代码)

我觉得算是给swan的自证之旅画上一个句号吧...说实话HDU给我带来的不止是排位上的压力&#xff0c;更多的是对自己能力的怀疑&#xff0c;特别是pluto不明说但是我很清楚的看不起&#xff08;没有责备本人的意思&#xff09;&#xff0c;evil和jxj之类的总感觉看到我就是看小丑…

元器件基础学习笔记——双极结型晶体管 (BJT)

一、概述 1.1 基本结构 双极结型晶体管&#xff08;Bipolar Junction Transistor&#xff09;由发射极&#xff08;Emitter&#xff09;、基极&#xff08;Base&#xff09;和集电极&#xff08;Collector&#xff09;三个掺杂程度不同的半导体区域组成&#xff0c;分别对应有…