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

云原生之认识DDD

一、DDD是什么?

领域驱动设计(DDD) 做为一种软件工程的方法论,它可以帮助我们设计高质量的软件,或者说任何工程的设计都需要方法论,不论是城市设计、建筑设计、室内设计。

比如没有方法论的情况下楼是可以盖起来的,或许整个楼道和窗户上挂满了电话线、闭路线、电线?下水道隔三差五就堵了?某一户跳闸了导致整个楼都停电了?那么盖楼前是否有好的方法论去建模呢?

不论任何行业的工程设计都因该使用正确的方法论去设计。任何行业的方法论也离不开八个字分而治之、拥抱变化。如果和城市的设计、建筑的设计相比较,我认为软件的设计会更复杂,软件的迭代和变化周期更快,也意味着我们更需要好的方法论。

字面上的领域模型并不抽象,可以理解为uml建模中的对象,它有什么属性?它有什么行为?那么就可以把它规划成某个领域的概念。

DDD 是一个分而治之的过程,是一系列分而治之的方法论。

如何把一个公司的领域划分成多个子域,比如教育公司会划分成作业子域、课程子域。电商可能会划出商品子域、物流子域。如何为每个子域划分出多个实体、聚合、服务,如何每一个实体和聚合设计它们的事件,如何为每一个实体设计它们的仓库。这就是DDD要做的事情!

二、贫血和充血模型

2.1 贫血模型

贫血模型,所谓的贫血模型是在定义对象时,指定以对象的属性信息,却没有对象的行为信息。

比如,定义Employee对象会包含id,name,age,sex,role,phone等信息,最后再通过添加一些对象属性的get/set方法来赋值取值操作。

这些贫血对象在设计之初就被定义为只能包含数据,不能加入领域逻辑;所有的业务逻辑是放在所谓的业务层(xxxService, xxxManager对象中),需要使用这些模型来传递数据。

2.2 充血模型

充血模型,在定义对象时不但包含对象的属性信息,还包括对象的行为信息。所以充血模型是一种有行为的模型,模型中状态的改变只能通过模型上的行为来触发,同时所有的约束及业务逻辑都收敛在模型上。

2.3 贫血模型和充血模型的区别

1)贫血模型是事务脚本模式,贫血模型相对简单,模型上只有数据没有行为,业务逻辑由xxxService、xxxManger等类来承载,相对来说比较直接,针对简单的业务,贫血模型可以快速的完成交付,但后期的维护成本比较高,很容易变成我们所说的面条代码。

2)充血模型是领域模型模式,充血模型的实现相对比较复杂,但所有逻辑都由各自的对象来负责,职责比较清晰,方便后期的迭代与维护。充血模型更加符合现实中的对象,因为一个员工在现实世界里不只有姓名,年龄,电话等,还可以工作,吃饭,睡觉等行为,只有属性信息的对象不是一个完整的对象。

面向对象设计主张将数据和行为绑定在一起也就是充血模型,而贫血领域模型则更像是一种面向过程设计,很多人认为这些贫血领域对象是真正的对象,从而彻底误解了面向对象设计的涵义。

http://www.xdnf.cn/news/1535.html

相关文章:

  • 新型恶意软件采用独特混淆技术劫持Docker镜像
  • win11什么都不动之后一段时间黑屏桌面无法显示,但鼠标仍可移动,得要熄屏之后才能进入的四种解决方法
  • Kotlin基础知识全面解析(下)
  • java IO流
  • 【Linux内核】内核中的中断管理
  • 中篇:深入剖析 L2CAP 与 ATT 协议模块(约5000字)
  • 程序员鱼皮最新项目-----AI超级智能体教程(一)
  • Bytebase 取得 SOC 2 Type 1 认证
  • Kafka的ISR机制是什么?如何保证数据一致性?
  • 【金仓数据库征文】加速数字化转型:金仓数据库在金融与能源领域强势崛起
  • 【计算机视觉】CV实战项目- 深度解析FaceAI:一款全能的人脸检测与图像处理工具库
  • Cadence 建立复合原理图封装时怎么切换页面
  • 【数据可视化-29】食物营养成分数据可视化分析
  • 深度解析 LangChain、ReAct、ReROO 架构及其在 AI Agent 中的应用
  • Vue3 中 computed的详细用法
  • 金融软件测试有哪些注意事项?专业第三方软件测试服务机构分享
  • 【bug修复】一次诡异的接口数据显示 bug 排查之旅
  • JavaScript学习教程,从入门到精通,XMLHttpRequest 与 Ajax 请求详解(25)
  • Qt C++/Go/Python 面试题(持续更新)
  • Playwright 入门教程:从概念到应用(Java 版)
  • 协作开发攻略:Git全面使用指南 — 结语
  • windows上的RagFlow+ollama知识库本地部署
  • Spring Boot实战(三十六)编写单元测试
  • vuedraggable Sortable.js 实现拖拽排序功能VUE3
  • 4.2 Prompt工程与任务建模:高效提示词设计与任务拆解方法
  • 【Python网络爬虫实战指南】从数据采集到反反爬策略
  • HTML5 服务器发送事件 (Server-Sent Events):实现网页自动获取服务器更新
  • [论文阅读]REPLUG: Retrieval-Augmented Black-Box Language Models
  • 嵌入式:Linux系统应用程序(APP)启动流程概述
  • Qt 处理 XML 数据