DDD领域驱动设计

  • 一、什么是DDD
  • 二、系统老化的原因
  • 三、高质量代码的标准
  • 四、DDD基础概念
    • 4.1实体、值对象
    • 4.2贫血模型
    • 4.3仓库和工厂
    • 4.4防腐层
    • 4.5基础设计层
    • 4.6领域服务
    • 4.7聚合
  • 五、DDD优点
  • 六、DDD四层架构规范

一、什么是DDD

领域驱动设计,是一种架构思想。以领域模型为核心,强调在代码中体现领域的思想,开发人员和领域专家一起进行系统建设。没有一种稳定的技术框架,DDD要求领域跟技术、存储、通信无关。
解决系统老化,防止系统老化。

大泥团:不利于微服务的拆分。大泥团结构拆分出来的微服务依然是泥团机构,当服务业务逐渐复杂,这个泥团又会膨胩成
为大泥团。

面向业务来建立领域模型,比如商品领域、物流领域。
MVC架构-》领域优先的四层架构:

二、系统老化的原因

1.需求难,越来越难实现,系统越来越复杂,需求也很难提。
2.开发难,一个类上千行代码,这段代码有什么功能?能不能去掉?越来越难开发。
3.测试难,没办法单元测试,一个小需求需要回归测试,工作量变大。
4.创新难,新技术越来越多,老系统重构要花的时间越来越多,越拖越烂。

三、高质量代码的标准

高内聚、低耦合,考虑代码的可维护性、可测试性、可扩展性。
单一职责原则:每个功能模块只做单一的事情。
开放封闭原则:对扩展开放,对修改封闭。
依赖反转原则:依赖接口,而不依赖实现类。

四、DDD基础概念

4.1实体、值对象

实体承载业务:实体类里面放业务相关的属性和业务方法,每个实体的业务要求清晰。
业务是造成实体状态变化的动作,比如:转账,造成了账号(实体)的金额(实体的属性、状态)发生变化。
特别的,业务是不包含在数据库的查询,增删,保存。数据库的增删改查不影响实体状态的变化。

值对象:
order->orderItem->Address
整体和部分的关系,就是实体和值对象的关系。如果订单不存在了,订单表和地址就没有意义了。

好处:入口单一,当访问值对象的业务时,要从实体访问。

4.2贫血模型

实体+业务方法=充血模型
POJO=贫血模型
贫血模式就是类里面只有成员变量和get、set方法。
贫血模型的问题:不知道这个POJO对象实体以前的业务有哪些逻辑(贫血失忆症)

4.3仓库和工厂

仓库repository:放着一个对象池,放着我们业务需要的所有对象和数据。
工厂factory:组装复杂对象,组装从数据库拿的数据。

4.4防腐层

防腐层ACL:隔离第三方的依赖,防止第三方业务的变化影响自己的业务。
对第三方接口的返回值进行一个结果集的封装。

4.5基础设计层

系统内调用的基础组件比如mq,可以将方法脱构,类脱构。

4.6领域服务

每个实体只能操作自己的属性,而跨实体的操作,需要抽象成领域服务,专属于当前领域使用的服务。只能调用领域的业务方法,比如转账业务。

4.7聚合

当有多个领域相同,领域与领域之间进行交互会形成一个一个聚合。在每个聚合里面会形成一个固定的聚合根。比如一个领域两个是实体,在两个实体里面聚合会指定一个聚合根,对聚合内对象的访问必须经由聚合根对象。

五、DDD优点

1、需求更容易梳理:业务逻辑清晰纯净, 没有业务与实现细节之 间的复杂转换。
2、业务更容易开发:各领域内完全自治, 不用担心其他模块的影响。
下单模块的Account与账务管理模块的Account属性与方法都可以完全不同,没有任何直接关联。
3、更容易单元测试:业务与外部依赖完全隔离,各功能组件的依赖也都是独立的。
很容易设计单元测试案例,单独测试。
4、技术容易更新:所以实现细节都是业务逻辑的扩展,指哪改哪。对业务无影响。

六、DDD四层架构规范

1、领域中的对象由实体和值对象组成。对值对象的访问必须经由所属的实体对象。
2、相关联的一组实体与值对象组成聚合。对聚合内对象的访问必须经由聚合根对象。
3、跨实体的操作必须经由领域服务。
4、应用服务层只通过领域服务或者聚合根来组织业务,自身不带任务实现逻辑。
5、业务与数据隔离。领域层只关注业务,数据支撑全部交由基础设施层。

浅析DDD领域驱动设计——一种很厉害的架构思想相关推荐

  1. [转]浅析DDD(领域驱动设计)

    最近在做一些微服务相关的设计,内容包括服务的划分,Restful API的设计等.其中比较棘手的就是Service的职责划分:如何抽象具有统一业务范畴的Model,使其模块化,又如何高度提炼并组合多模 ...

  2. 浅析DDD(领域驱动设计)

    最近在做一些微服务相关的设计,内容包括服务的划分,Restful API的设计等.其中比较棘手的就是Service的职责划分:如何抽象具有统一业务范畴的Model,使其模块化,又如何高度提炼并组合多模 ...

  3. DDD领域驱动设计 — 贫血模型与充血模型

    文章转载来源:https://juejin.cn/post/6917125801460629518 | 前言  要想深入掌握和了解 DDD 领域驱动设计的核心,那无论如何也绕不开两大较为抽象的概念-- ...

  4. DDD 领域驱动设计:贫血模型、充血模型的深入解读!

    作者:JavaEdge在掘金 链接:https://juejin.cn/post/6917125801460629518 -     前言     - 要想深入掌握和了解 DDD 领域驱动设计的核心, ...

  5. 浅谈我对DDD领域驱动设计的理解

    从遇到问题开始 当人们要做一个软件系统时,一般总是因为遇到了什么问题,然后希望通过一个软件系统来解决. 比如,我是一家企业,然后我觉得我现在线下销售自己的产品还不够,我希望能够在线上也能销售自己的产品 ...

  6. C#进阶系列——DDD领域驱动设计初探(五):AutoMapper使用

    前言:前篇搭建了下WCF的代码,就提到了DTO的概念,对于为什么要有这么一个DTO的对象,上章可能对于这点不太详尽,在此不厌其烦再来提提它的作用: 从安全上面考虑,领域Model都带有领域业务,让Cl ...

  7. DDD 领域驱动设计:贫血模型、充血模型的深入解读

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 -     前言 ...

  8. DDD 领域驱动设计-三个问题思考实体和值对象(续)

    上一篇:DDD 领域驱动设计-三个问题思考实体和值对象 说实话,整理现在这一篇博文的想法,在上一篇发布出来的时候就有了,但到现在才动起笔来,而且写之前又反复读了上一篇博文的内容及评论,然后去收集资料, ...

  9. DDD领域驱动设计浅谈

    DDD领域驱动设计是什么 1 DDD是什么? DDD是领域驱动设计,是Eric Evans于2003年提出的,离现在有17年. DDD名为:Domain Driven Design (领域驱动设计) ...

  10. DDD领域驱动设计-视频讲解+实战

    目录 简介 解决的问题 过度耦合 现状 DDD的分层架构和构成要素 小结 分包应用 DDD领域驱动设计:实体.值对象.聚合根 DDD应用 战略建模 领域 限界上下文 需求分析 上下文映射图 战术建模- ...

最新文章

  1. [Swust OJ 404]--最小代价树(动态规划)
  2. Xamarin XAML语言教程使用方法设置进度条进度
  3. 进程句柄表初始化,扩展,插入删除句柄源码分析
  4. 个人图书管理系统c语言代码,c语言源代码---------------个人图书管理系统
  5. SecureCRT如何显示颜色和高亮显示
  6. 蓝牙配对模式 java_BLE(低功耗蓝牙)配对和绑定
  7. python linux服务_Python脚本作为Linux服务/守护程序
  8. python中的print
  9. 总奖池25万!百度AI Studio人工智能竞赛火热报名中
  10. 毕业设计(五)---spring学习笔记(3)之-dataSource,sessionFactory,hibernateTemplate,事务 的简单配置。...
  11. java jdk 加密_jdk实现常见的加密算法
  12. MongoDb In Action
  13. IDEA - 返回上一步,回到下一步 代码 快捷键
  14. Geotrust证书新申请及续费
  15. IT 行业有前景么?
  16. UnboundLocalError: local variable ‘Num_fSu‘ referenced before assignment
  17. [反汇编练习] 160个CrackMe之023
  18. 计算机键盘无法使用的原因,电脑键盘失灵的原因及其解决方法
  19. 想提高跨境电商转化率?采用这几个技巧!
  20. 计算机基础知识及列表操作

热门文章

  1. Python系列 之 ReportLab库 pdfgen模块Canvas对象绘制图形和文本
  2. html文件嵌入到reportlab,Django Reportlab使用HTML
  3. 离散信号的希尔伯特变换的计算公式_离散信号的hilbert 变换.ppt
  4. switch交换的vlan三种模式详解
  5. uniapp开发小程序-获取支付宝小程序用户手机号功能
  6. MessageBox用法大全
  7. delphi问题归档(转载摘录)
  8. 网上交易安全-使用JAVA调用U盾进行客户认证
  9. 计算机英语拼读法,常用计算机英语词汇:DVD
  10. 知识付费的多重属性与本质特征