Domain Driven Design 领域驱动设计 — DDD

前言

在阅读的很多资料中,DDD有很多概念:领域、子域、核心域、通用域、支持域、实体、领域服务、聚合、聚合根、工厂、仓库、领域边界 … …

众多的概念令人眼花缭乱,直接去理解这些概念是一件很麻烦的事情。所以,让我们先梳理一下DDD的脉络,再去理解这些细节。

软件设计的最终目的是什么?

其实软件设计的最终目的是为了提高代码的复用,想用实现复用,那么首先就需要封装变化

DDD到底是什么?

DDD是Eric Evans在2003年出版的《领域驱动设计:软件核心复杂性应对之道》(Domain-Driven Design: Tackling Complexity in the Heart of Software)一书中提出的具有划时代意义的重要概念:
领域驱动设计是指通过统一语言、业务抽象、领域划分和领域建模等一系列手段来控制软件复制度的方法论

简单的说,DDD是为了解决快速变化的复杂系统的设计问题的一种设计思想

DDD解决的问题?

DDD是杜绝软件退化的利器

  • 软件退化的根源:

    • 最初只能将简单、清晰、易于理解的业务逻辑做到软件中
    • 还有许多不简单、不明了、不易理解的业务逻辑没做到软件中
    • 也就是说,软件退化,是软件业务由简单向复杂转变的必然结果
  • 运用DDD,当系统业务变得越来越复杂时,将业务的理解绘制成领域模型,可以正确的指导软件开发。

  • 组织微服务的钥匙:

    • 微服务不是"银弹",也有很多的“坑”
    • Martin Flower在定义微服务时提到“小而专”,很多人get到了“小”,而忽略了“专”。微服务内高内聚,微服务间低耦合。
    • 转型微服务的根源,其实是系统规模越来越大,维护越来越困难,才需要拆分“微服务”,而微服务直接的组织的钥匙,便是DDD。
  • 要让DDD在团队中用的好,需要一个支持DDD与微服务的技术中台

实例对比

伪代码实现

我们先来看一段伪代码,业务便是简单的学生选课

下面是一段常用的MVC的实现,下午称为代码1


在这段代码中,student实体是一种贫血模型,那么什么又是贫血模型呢,之后我们会和充血模型进行对比说明。


看明白MVC的实现之后,我们再来看另一种实现,下文称为代码2:


这这段实现中,抽象出来的checkService,会应对业务的变化,做出相应的改变,我们称之为防腐层

抽象出MQ基础设施层,防止第三方组件的变化(可能是rabbitmq,可能是kafka,可能是rocketmq等等)

贫血模型VS充血模型

在代码对比之前,我们先要搞明白贫血模型与充血模型的区别。

  • 贫血模型: 代码1中,在常用的MVC模式下,student采用贫血模型,之后提供属性与相关的set/get方法,这类对象会被各种Service所调用,从而分布在不同的业务中。如此下来,你还敢随便改student信息么?除非你读懂每个Service的调用过程。

  • 充血模型: 如果改为充血模型,student类中可以加入run()、upGrade()等等和自身业务相关的业务逻辑。这类对象,也就可以理解为域(Domain)
    对于域的封装,每个域不要受其他域的影响,每个域操作自己的变化。而跨域的变化,通过领域服务搞定,由领域服务调用域的方法来完成状态的变化。
    我们来举个例子:student与teacher两个对象,teacher类的提问()需要调用student类的回答(),而想这样的域与域之间的联系(调用),我们可以将它写到一个Service中,而这个Service,就可以称作领域服务


防腐层

防腐层:隔离变化

代码2中,checkService做业务检验,也不不变,代码不变;当业务发生变化,也只有checkService内的代码发送变化。代码2中的代码还是不会发生变化。


对比

  • 业务逻辑清晰度:代码2业务人员也可以大体读懂
  • 业务稳定性: 代码2业务不动,代码不动
  • 防腐层隔离变化
  • 各领域内自治,可以自我发展
  • 用仓库StudentRepository来管理Student的存储
  • 仓库中集成工厂Factory/Builder应对复杂对象的组装
  • MVC保证了实现最差也差不到哪去(但基本总是最差),DDD如果做的差,会比MVC还要差,如果做的好,的确可以应对业务变化(了解业务,预测业务变化)

两个问题

1、充血模型和充血模型怎么做交互?

跨域的变化,通过领域服务搞定,由领域服务调用域的方法来完成状态的变化。

2、怎么和数据库做交互?

用仓库StudentRepository来管理Student的存储

Domain Driven Design 领域驱动设计相关推荐

  1. DDD(Domain Driven Design) 领域驱动设计从理论到实践 四

    - 接上 SOA 架构 ​     面向服务架构(Service Oriented Architecture,SOA)对于不同的人来说意思不同.这里梳理一下SOA原则: 服务契约 : 通过契约文档,服 ...

  2. DDD(domain driven design)-领域驱动设计

    domain driven design-领域驱动设计 领域驱动设计概述 背景 软件架构模式的演进 概念 分层架构与六边形架构 分层分包 复杂是我们软件生涯的一生之敌. 分层架构 & 面向过程 ...

  3. DDD(Domain-Driven Design 领域驱动设计) 与产品设计

    DDD(Domain-Driven Design 领域驱动设计) 与产品设计 DDD (Domain-Driven Design 领域驱动设计) 或许也叫 Dream-Driven Design,某度 ...

  4. DDD(Domain-Driven Design)领域驱动设计-(一)整体概述

    前言 最近公司通过8节课组织了DDD培训,在此以系列文章作为总结,本篇文章主要介绍DDD整体概述 什么是DDD?(领域驱动设计) 传统架构方式 如果对于传统的web开发比较熟悉的同学一定会了解传统的三 ...

  5. DDD(Domain-Driven Design)领域驱动设计-(三)命令风暴寻找聚合

    回顾 上文我们讲了事件风暴,找出了系统中所有的事件,都通过"something has been done"的形式描述,如"填空题被创建"等 DDD整体的三个阶 ...

  6. DDD(Domain-Driven Design)领域驱动设计-(二)事件风暴

    本节及后边的章节都以实际的例子进行描述,并且完整的按照DDD的流程实现该系统 题目如下: 背景介绍 一个面向学校师生的网上考试系统 需求描述 1.老师可以创建一门课程○一门课程包含多个视频和一场考试 ...

  7. 阿里技术专家 分享 DDD(Domain-Driven Design 领域驱动设计)

  8. 初探领域驱动设计(Domain Driven Design)

    前言: 我个人在学习DDD的过程中,早期翻找各种资料的时候,看到了很多名词:战略设计.战术设计.聚合根.实体.值对象.界限上下文...这些繁多的名词定义配合上几乎少的可怜的实战例子,让我在翻阅了大量资 ...

  9. DDD领域驱动设计浅谈

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

  10. 领域驱动设计(DDD:Domain-Driven Design)

    领域驱动设计(DDD:Domain-Driven Design) Eric Evans的"Domain-Driven Design领域驱动设计"简称DDD,Evans DDD是一套 ...

最新文章

  1. 如何使用React提前三天计划
  2. 新晋院士:直到硕士毕业前都想做公务员,现在只对科研感兴趣
  3. iframe内联元素有白边原因_Selenium无法定位元素的几种解决方案
  4. where is ConstraintViolationException raised
  5. 2021年北京交通大学925数据结构考研真题回忆版
  6. 日志写入hbase_千亿级日志系统设计思路,牛人必学!
  7. java controller json_Controller 获取 JSON
  8. hnu 暑期实训之魔咒词典
  9. 【class2src】Decompiler
  10. Site-Site Ipsec ×××配置和验证
  11. luma3ds7.1按start键开机无法启动payload解决
  12. RFC 2544阅读笔记
  13. 如何使用图片的exif信息计算相机焦距
  14. FlashDB移植与应用
  15. 我的游戏学习日志3——三国志GBA
  16. 计算机网卡更改mac地址,Mac电脑网卡MAC地址修改的具体步骤
  17. 自定义View—弹性滑动
  18. 【cocos2d-x入门实战】微信飞机大战之十三:游戏场景过渡
  19. 解析石墨烯技术专利:锂离子电池成热点技术领域
  20. 谷歌浏览器登录问题解决

热门文章

  1. CorelDRAW2020下载使用教程详解
  2. 『西少爷们』除了炒作,还有什么?
  3. 网页截图服务器,命令行下的2款网页截图工具推荐
  4. 各项数字技术的发展历程
  5. 输出大于某个正整数n的最小质数(1除外
  6. 软件工程专业的大三学生经历和感悟
  7. 华为笔试题-圣诞的祝福
  8. 浅谈对于机器学习的理解
  9. 人工智能、机器学习、深度学习 -- 学习摘记
  10. 扒一扒那些叫欧拉的定理们(一)——基本介绍和简单多面体欧拉定理