领域驱动设计简介
领域驱动设计(Domain-Driven Design)简称DDD。
目录
- DDD是什么?
- DDD和已有方法的区别是什么?
- DDD有什么特点?
- DDD应该怎么做?
- DDD如何开始?
DDD是什么?
DDD是由 Eric Evans 提出的,综合软件系统分析和设计的面向对象建模方法。如今已经发展成为了一种针对大型复杂系统的领域建模与析方法。
DDD是针对软件开发领域的一种系统与理论分析方法,是一种方法论。
DDD和已有方法的区别是什么?
传统方法:
- 是针对数据库建模,是关系型数据库理论的延续,关注数据表和数据表之间的关系,是面向技术建模。
DDD:
- 将业务概念和规则转变为软件系统中的类型及其属性和行为
- 合理利用面向对象的封装、继承、多态等设计要素
- 降低或隐藏系统的业务复杂度
- 提升系统扩展性
DDD有什么特点
- 建立了==以领域为核心驱动力==的设计体系
- 不是架构方法,不是设计模式
- 是一种思维方式。是一种优先任务,加速复杂领域的软件开发
DDD怎么做
- 强调领域模型的重要性
通过模型驱动设计来保证领域模型和程序设计一致 - 从业务需求提炼统一语言
基于统一语言建立领域模型
领域模型指导程序设计及编码 - 通过重构发现隐式概念
用设计模式改进设计与开放质量
DDD战略设计
- 问题域
- 分解问题域。包括限界上下文和上下文映射。
- 识别核心领域和子领域
- 架构
- 分层架构
- 六边形架构
- CQRS模式
DDD相关概念
领域(Domain):
现实世界中,领域包含了问题域和解系统。一般认为软件是对现实世界的部分模拟。在DDD中,解系统可以映射为一个个限界上下文,限界上下文就是软件对于问题域的一个特定的、有限的解决方案。
界限上下文(Bounded Context):
一个由显示边界限定的特定职责。领域模型便存在于这个边界之内。在边界内,每一个模型概念,包括它的属性和操作,都具有特殊的含义。
限界上下文之间的映射关系
- 合作关系(Partnership):两个上下文紧密合作的关系,一荣俱荣,一损俱损。
- 共享内核(Shared Kernel):两个上下文依赖部分共享的模型。
- 客户方-供应方开发(Customer-Supplier Development):上下文之间有组织的上下游依赖。
- 遵奉者(Conformist):下游上下文只能盲目依赖上游上下文。
- 防腐层(Anticorruption Layer):一个上下文通过一些适配和转换与另一个上下文交互。亦称适配层。在一个上下文中,有时需要对外部上下文进行访问,通常会引入防腐层的概念来对外部上下文的访问进行一次转义。
- 开放主机服务(Open Host Service):定义一种协议来让其他上下文来对本上下文进行访问。
- 发布语言(Published Language):通常与OHS一起使用,用于定义开放主机的协议。
- 大泥球(Big Ball of Mud):混杂在一起的上下文关系,边界不清晰。
- 另谋他路(SeparateWay):两个完全没有任何联系的上下文。
领域模型(Domain Model):
领域通用语言(UBIQUITOUS LANGUAGE):
DDD战术设计
- 表示模型的元素
- 值对象(Value Object):当一个对象用于对事务进行描述而没有唯一标识时,它被称作值对象(Value Object)。它具有不变性、相等性和可替换性。
- 实体(Entity):当一个对象由其标识(而不是属性)区分时,这种对象称为实体(Entity)。
- 领域服务(Domain Service):一些重要的领域行为或操作,可以归类为领域服务。它既不是实体,也不是值对象的范畴。领域服务本身所承载的职责是通过串联领域对象、资源库和防腐层等一系列领域内的对象的行为,对其他上下文提供交互的接口。
- 领域事件:领域事件是对领域内发生的活动进行的建模。
- 资源库:领域对象需要资源存储,存储的手段可以是多样化的,常见的无非是数据库,分布式缓存,本地缓存等。资源库(Repository)的作用,就是对领域的存储和访问进行统一管理的对象。
- 工厂
- 聚合(Aggregate):聚合是一组相关对象的集合,作为一个整体被外界访问,聚合根(Aggregate Root)是这个聚合的根节点。聚合由根实体,值对象和实体组成。核心领域往往都需要用聚合来表达。
- 应用服务
- 元素之间的关系