领域驱动设计DDD入门(一)

领域驱动设计简介

领域驱动设计(Domain-Driven Design)简称DDD。

目录

  • DDD是什么?
  • DDD和已有方法的区别是什么?
  • DDD有什么特点?
  • DDD应该怎么做?
  • DDD如何开始?

DDD是什么?

DDD是由 Eric Evans 提出的,综合软件系统分析和设计的面向对象建模方法。如今已经发展成为了一种针对大型复杂系统的领域建模与析方法。
DDD是针对软件开发领域的一种系统与理论分析方法,是一种方法论。

DDD和已有方法的区别是什么?

传统方法:

  • 是针对数据库建模,是关系型数据库理论的延续,关注数据表和数据表之间的关系,是面向技术建模。

DDD:

  • 将业务概念和规则转变为软件系统中的类型及其属性和行为
  • 合理利用面向对象的封装、继承、多态等设计要素
  • 降低或隐藏系统的业务复杂度
  • 提升系统扩展性

DDD有什么特点

  • 建立了==以领域为核心驱动力==的设计体系
  • 不是架构方法,不是设计模式
  • 是一种思维方式。是一种优先任务,加速复杂领域的软件开发

DDD怎么做

  1. 强调领域模型的重要性
    通过模型驱动设计来保证领域模型和程序设计一致
  2. 从业务需求提炼统一语言
    基于统一语言建立领域模型
    领域模型指导程序设计及编码
  3. 通过重构发现隐式概念
    用设计模式改进设计与开放质量

DDD战略设计

  1. 问题域
    • 分解问题域。包括限界上下文和上下文映射。
    • 识别核心领域和子领域
  2. 架构
    • 分层架构
    • 六边形架构
    • 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战术设计

  1. 表示模型的元素
    • 值对象(Value Object):当一个对象用于对事务进行描述而没有唯一标识时,它被称作值对象(Value Object)。它具有不变性、相等性和可替换性。
    • 实体(Entity):当一个对象由其标识(而不是属性)区分时,这种对象称为实体(Entity)。
    • 领域服务(Domain Service):一些重要的领域行为或操作,可以归类为领域服务。它既不是实体,也不是值对象的范畴。领域服务本身所承载的职责是通过串联领域对象、资源库和防腐层等一系列领域内的对象的行为,对其他上下文提供交互的接口。
    • 领域事件:领域事件是对领域内发生的活动进行的建模。
    • 资源库:领域对象需要资源存储,存储的手段可以是多样化的,常见的无非是数据库,分布式缓存,本地缓存等。资源库(Repository)的作用,就是对领域的存储和访问进行统一管理的对象。
    • 工厂
    • 聚合(Aggregate):聚合是一组相关对象的集合,作为一个整体被外界访问,聚合根(Aggregate Root)是这个聚合的根节点。聚合由根实体,值对象和实体组成。核心领域往往都需要用聚合来表达。
    • 应用服务
  2. 元素之间的关系

未完待续

你可能感兴趣的:(领域驱动设计DDD入门(一))