DDD基础

是什么:领域驱动设计是一种方法论:是针对软件开发领域提出的一套系统与理论分析方法 是一种思维方式,也是一组优先任务

目的:降低或隐藏整个系统的业务复杂性,并使得系统具有更好的扩展性,应对纷繁多变的现实业务问题。 加速那些必须处理复杂领域的软件项目的开发

方法:

1 将要解决的业务概念和业务规则转换为软件系统中的类型以及类型的属性与行为

2 合理运用面向对象的封装、继承和多态等设计要素

为什么用DDD:

批判以数据以及数据样式为核心的系统建模方法:

面向数据建模:关系数据库理论的延续,关注的是数据表以及数据表之间关系的设计。

面相数据建模缺点:面对日渐复杂的业务逻辑,面向数据建模欠缺灵活性与可扩展性,也无法更好地利用面向对象设计思想及设计模式,建立可重用的、可扩展的代码单元。

扫描二维码关注公众号,回复: 10424704 查看本文章

DDD建模:使用用例(Use Case)、测试驱动开发(TDD)、用户故事(User Story)来帮助我们对领域建立模型;

架构:引入整洁架构思想及六边形架构,以帮助我们建立一个层次分明、结构清晰的系统架构

领域模型的表达:引入函数式编程思想,利用纯函数与抽象代数结构的不变性以及函数的组合性来表达领域模型

建模:

强调领域模型的重要性,并通过模型驱动设计来保障领域模型与程序设计的一致。

从业务需求中提炼出统一语言(Ubiquitous Language),再基于统一语言建立领域模型;这个领域模型会指导着程序设计以及编码实现;

在其中扮演重要指导作用的则是“领域模型”

针对问题域和业务期望提炼统一语言,并通过统一语言进行领域建模时,可能会面临高复杂度的挑战。

从宏观层次划分不同业务关注点的子领域,然后再深入到子领域中从微观层次对领域进行建模

领域驱动设计的战略设计阶段 考量的两个方面:

1 问题域:

问题合理分解:引入限界上下文(Bounded Context)上下文映射(Context Map)对问题域进行合理的分解,

问题分解需要产出:1 核心领域 2 子领域 3 确定领域的边界以及 各个领域之间的关系(目的是维持模型的完整性)

2 架构:

使用分层架构 进行隔离 , 尤其将领域实现独立出来 (保证领域模型的单一性稳定性)

CQRS 模式则分离了查询场景和命令场景,针对不同场景选择使用同步或异步操作,来提高架构的低延迟性与高并发能力。

战略设计初衷: 保证模型的完整性

限界上下文(Bounded Context) 边界 保证上下文内部 与其他上下文之间的领域 互不冲突

限界上下文意义:

1 对领域模型 的控制

2 各个领域分离关注点后,整个上下文可以成为独立部署的单元

确立了限界上下文的边界(物理边界),分层架构仅仅针对粒度更小的限界上下文。

对当前上下文的领域与技术实现进行了封装

调用方只关心对外暴露的接口与集成方式,形成了在服务层次的设计单元重用(基础服务组 划分为 人员 骑手 区域 也是限界上下文的一种体现么?)

边界的意义:极大程度提高了限界上下文内部的自由度

在不同的限界上下文选择不同的架构模式

例如:

1 针对订单的查询与处理,选择 CQRS 模式来分别处理同步与异步场景;

2 针对核心领域与子领域重要性的不同,分别选择领域模型(Domain Model)和事务脚本(Transaction Script)模式,灵活地平衡开发成本与开发质量

在战略设计阶段 整个系统被分为 多个限界上下文(领域),进而 可以 分而治之,对每个限界上下文进行战术设计

战术设计阶段

领域驱动设计 在战术层面 主要应对领域的复杂性

如上图所示 DDD 用以表示模型的主要要素为:

  • 值对象(Value Object)

  • 实体(Entity)

  • 领域服务(Domain Service)

  • 领域事件(Domain Event)

  • 资源库(Repository)

  • 工厂(Factory)

  • 聚合(Aggregate)

  • 应用服务(Application Service)

DDD围绕着领域模型进行设计

分层架构(Layered Architecture)将领域独立出来

表示领域模型的对象包括:实体值对象领域服务 用来封装全部的领域逻辑

在领域驱动设计的演进中,又引入了领域事件来丰富领域模型。

聚合是一种边界,它可以封装一到多个实体值对象,并维持该边界范围之内的业务完整性。

在聚合中,至少包含一个实体,且只有实体才能作为聚合根(Aggregate Root)

在领域驱动设计中,没有任何一个类是单独的聚合,因为聚合代表的是边界概念,而非领域概念。

在极端情况下,一个聚合可能有且只有一个实体。

工厂资源库都是对领域对象生命周期的管理。

工厂负责领域对象的创建,往往用于封装复杂或者可能变化的创建逻辑;

资源库负责从存放资源的位置(数据库、内存或者其他 Web 资源)获取、添加、删除或者修改领域对象。领域模型中的资源库不应该暴露访问领域对象的技术实现细节。

战略设计会控制和分解战术设计的边界与粒度,

战术设计则以实证角度验证领域模型的有效性、完整性与一致性,进而以演进的方式对之前的战略设计阶段进行迭代,从而形成一种螺旋式上升的迭代设计过程,如下图所示:

发布了84 篇原创文章 · 获赞 6 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/csdn_9527666/article/details/105220913
ddd
今日推荐