软件架构 - 领域驱动设计

2023-10-07 14:28
什么是领域驱动设计

领域驱动设计的概念是2003年Evic Evans在《领域驱动设计:软件核心复杂性应对之道》(Domain-Driven Design : Tackling Complexity in the Heart of Software)一书中提出的。它是一种以“领域”模型为核心的软件开发方法。那么什么是“领域”模型呢?通常指的是某类业务应用的“业务”模型,但我认为“业务”的概念是相对,譬如对于底层文件存储来说,数据库系统就是“业务”应用。我理解"领域"实际上是某类专业领域知识,而领域模型则是我们通过软件设计对这些专业知识(用于解决特定问题)的建模(不仅仅是数据结构或对象),包括数据结构,处理逻辑以及与外部的交互等等。

对业务进行抽象建模来解决复杂性并不是一件新鲜事,很早就已经出现了(至少是在七八十年代),因此,我认为质上,其仍然是“向对象设计”思想的进一步延伸,而其最大的贡献在于对过去大家使用的不同方法进行了再次“抽象”(统一名词,方法指引等)。

领域驱动设计的战略思想

这是经常被大家忽略的一部分内容,但我认为这个才是领域驱动设计思想的核心,通过战略设计我们从顶层对业务进行抽象,“正确”的划分出合理的系统边界,确定核心业务模型。我觉得可以理解为战略设计指导构建了整个系统建设的主干或者说骨架。其中的主要概念如下:

  • 通用语言 - Ubiquitous Language,我认为这是领域驱动最根本的战略思想,这可能是源于作者本身是极限编程(Extreme Programming)的支持者,在团队中建立起“通用语言,代表构建了整个团队对于目标一致理解的基石,在此基础上我们才能正确或更好地完成目标。
  • 上下文边界 - Bounded Context,我理解是在业务领域中相对独立的业务单元,我们会在此上下文范围内抽象和定义领域模型。
  • 模型 - Model,承载核心业务逻辑的实现,我认为并不是单纯的数据结构或对象(Class),而是通过对业务的理解对解决特定领域问题的方法进行抽象。
领域驱动设计的战术介绍

战术层面是主要关注于具体的实现方法,也是在应用开发阶段(丰富骨架的血和肉)我们所主要涉及的,其中一些重要的概念包括:

  • 实体(Entity)   - 通常指面向对象中的对象(Object),拥有唯一的标识
  • 值对象(Value Objects )- 轻量级的对象,没有唯一标识
  • 服务(Services)- 通常为一些无状态的服务,既不是对象,也不是值对象的
  • 聚合(Aggreates)-   一组紧密相关对象的集合(通常他们在状态上保持一致性),最顶层我们称作聚合根
  • 工厂和数据源(Factories and Repositories)- 通常用于管理聚合对象,包括创建和存储
详细的描述,大家可以阅读作者的原书(推荐),这里就不深入讨论了。