当前位置: 首页 > news >正文

【DDD】——带你领略领域驱动设计的独特魅力

🎼个人主页:【Y小夜】

😎作者简介:一位双非学校的大三学生,编程爱好者,

专注于基础和实战分享,欢迎私信咨询!

🎆入门专栏:🎇【MySQL,Javaweb,Rust,python】

🎈热门专栏:🎊【Springboot,Redis,Springsecurity,Docker,AI】 

感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持!❤️

目录

🎈理解DDD设计思想及核心四层架构模型

🎋概念

🎋以领域划分为基础

🎋以四层架构为工具

🎋有助于解决系统老化问题

🎈DDD如何应对软件核心复杂性

🎋技术主动理解业务

🎋“刚刚好”解决问题

🎋DDD和设计模式有什么区别

🎈DDD改造实例

🎈缺点


🎈理解DDD设计思想及核心四层架构模型

误区:认为DDD的四层架构就是DDD的整体

🎋概念

        2004 年埃里克·埃文斯(Eric Evans)发表了《领域驱动设计》(Domain-Driven Design

–Tackling Complexity in the Heart of Software)这本书,从此领域驱动设计(Domain Driven Design,简称 DDD)诞生。DDD 核心思想是通过领域驱动设计方法定义领域模型,从而确定业务和应用边界,保证业务模型与代码模型的一致性

        DDD是一种设计思想,通过事件风暴使用通用语言对业务进行领域建模,通过限界上下文进行合理的领域拆分,可以使得领域模型转向微服务的设计和落地,从而解决复杂软件难以理解,难以演进,也可以解决微服务业务界限难以界定的问题。

🎋以领域划分为基础

领域的核心是边界(领域之间既有合作又有边界)

🎋以四层架构为工具

架构风格核心为:依赖 

🎋有助于解决系统老化问题

当然,微服务其实也可以解决系统老化的问题

但是其实ddd看问题的角度是变化,在变化过程中微服务体现出的问题治标不治本

软件核心的复杂性,并不是来源于庞大的软件体量或者负责的业务流程,而是来源于项目长期迭代过程中不断冒出的超出当初设计支出的不确定性。 

🎈DDD如何应对软件核心复杂性

🎋技术主动理解业务

主动放下技术身段,去贴切理解业务。

🎋“刚刚好”解决问题

我们大多数很多时候,我们会做一些提前设计。 但实际上,很多时候业务不是按技术而去发展的。DDD强调由技术人员出面,主动从技术角度思考问题,我们的每一步设计,就只需要解决到当前的问题就好了,哪些不确定的问题,我们只需要保留一定的可扩展度,留在日后再去解决。

🎋DDD和设计模式有什么区别

1.DDD强调团队合作,团队内的技术人员与业务人员用同样的方式思考问题。

软件有没有问题,业务说的算,而不是架构师说的算。

2.DDD强调“刚刚好”处理眼前的需求,避免过度设计。

好用的自行车比看不懂的宇宙飞船更有价值。

🎈DDD改造实例

DDD小妙招

1.使用充血模型的实体对象,描述核心业务。(系统做什么事情,一目了然)

例如:

我们传统使用的POJO只承载数据,不包含业务(贫血模式)

实体充血模型:将实体的属性以及引起实体状态变化的方法写到实体中。

2.使用仓库和工厂,封装实体持久化操作(摆脱数据库限制)

3.构建防腐层,隔离外部服务(众人皆醉我独醒)

4.使用领域服务,封装夸实体业务(保持实体纯粹性,出淤泥而不染)

🎈缺点

DDD并不是万能的银弹,映射到具体的业务场景时,DDD的理论体系也是需要由模糊到清的。

战略层次:

  • DDD缺乏一个规范的指导过程。
  • DDD没有万能的需求管理体系
  • DDD并没有给出明确的领域建模方法
  • 对团队整体的技术能力要求高
  • DDD学习成本高

技术层面:

  • 直接指导DDD落地的框架非常少
  • DDD是动态发展的,在不同的技术环境下,表现不同的表现形式。
http://www.lryc.cn/news/573669.html

相关文章:

  • C4.5算法深度解析:决策树进化的里程碑
  • 《HTTP权威指南》 第7章 缓存
  • mysql join的原理及过程
  • C++法则10:引用本身是一个“别名”(alias),一旦绑定到一个对象后,就不能再重新绑定到其他对象。
  • 【递归,搜索与回溯算法】记忆化搜索(二)
  • 如何处理RocketMQ的各种线上问题
  • 【Python学习笔记】报错:Unindent amount does not match previous indent
  • Spring Boot 项目初始化
  • AWS 使用图形化界面创建 EKS 集群(零基础教程)
  • LabVIEW图像拼接原理与实现 链接附件有演示录像
  • 如何用AI开发完整的小程序<9>—UI自适应与游戏页优化
  • 关于uniapp解析SSE响应数据的处理
  • 【学习笔记】深入理解Java虚拟机学习笔记——第11章 后端编译与优化
  • 关于CH32开发板烧录说明
  • 用可观测工具高效定位和查找设计中深度隐藏的bug
  • webpack+vite前端构建工具 -6从loader本质看各种语言处理 7webpack处理html
  • Linux内核中安全创建套接字:为何inet_create未导出及正确替代方案
  • SAP金属行业解决方案:无锡哲讯科技助力企业数字化转型与高效运营
  • Kafka Streams架构深度解析:从并行处理到容错机制的全链路实践
  • 针对数据仓库方向的大数据算法工程师面试经验总结
  • netcore url编码/解码
  • [计算机网络] 局域网内的网络传输
  • SpringBoot+Vue服装商城系统 附带详细运行指导视频
  • 3dgs涉及的基本概念:球谐系数(SH 系数)等
  • Python之数据容器
  • 【JavaScript】代码整理
  • vim学习流程,以及快捷键总结
  • Python 深度学习基础:TensorFlow 入门——从张量到神经网络的实战指南
  • 【2025年软考中级】第三章数据结构3.4 数组与矩阵
  • Flink作业三种部署模式:架构、配置与实战应用