第一章 DDD 的关键概念

105 阅读5分钟

DDD

  • Domain-Driven Design:Tackling Complexity in the Heart of Software
  • 是一种处理高度复杂领域的愿景(Vision)和方法,它主张在软件项目中把领域本身作为关注的焦点,维护一个对领域有深度认知的软件模型
  • DDD是一种面向对象分析(Object-Oriented Analysis,OOA)与设计的方法论,可以很好地与现代的面向对象的程序设计(Object-Oriented Programming,OOP)方法相结合,实现软件的编程方法会反过来影响分析方法。DDD所使用的术语,如对象(DDD将对象分为实体/引用对象、值对象)、属性等,了解OOP的开发人员会感觉很熟悉
  • DDD抛弃了分裂业务分析与软件设计的做法,使用单一的领域模型来同时满足这两方面的要求

对于开发者来说什么是最难的

  • Naming things
  • × Explaining what I do(or don't do)

什么是软件的核心复杂性

  • Complexity有繁杂之意。它的解释之一是:因为存在很多相互关联的部分而导致的状况
  • 对于大多数软件系统,它们的核心复杂性是由其服务的领域涉及的范围带来的

复杂性的结论:

  • 解决核心复杂性的关键还是在于切分(分而治之),也就是说希望可以缩减每次要解决的领域问题的范围,简化概念和概念之间的关系。DDD正是这么做的

什么是领域模型

  • DDD要求领域模型既能反映对领域的深度认知,又能直接用于指导软件的设计与实现
  • 领域模型不是一幅具体的图,它是那幅图想要去传达的那个思想。它也不是一个领域专家头脑中的知识,而是一个经过严格组织并进行选择性抽象的知识。一幅图能够描绘和传达一个模型,同样,经过精心编写的代码和一段英语句子

如何处理领域模型与分析模型的关系

  • 一种更好的方法是将领域建模和设计紧密关联起来。模型在构建时就考虑到软件的实现和设计。开发人员应该被加入到建模的过程中。主要的想法是选择一个能够在软件实现中恰当地表达的模型,这样设计过程会很顺畅并且是基于模型的。将代码与其所基于的模型紧密关联,将会使得代码更有意义,并且与模型保持相关。

实体

  • 有一类对象拥有标识符(简称ID),不管对象的状态如何变化,它的ID总是不变的,这样的对象称为实体

值对象

  • 用来描述领域的特定方面的、没有标识符的对象
  • 推荐将值对象实现为“不可变的”(Immutable)。也就是说,值对象由一个构造器创建,并且在它们的生命周期内永远不会被修改
    • 示例
    • ·可以声明一个属性的类型是Email,而不是String。
    • 可以声明一个属性的类型是手机号(MobileNumber),而不是String。
    • 可以声明一个属性的类型是邮政编码(PostalCode),而不是长整数(Long)。

聚合

  • 如果两个实体之间的状态出现不一致(即使只有非常短暂的一瞬间我们能看到它们的不一致)就让人难以接受的话,那么这两个实体属于同一个聚合;否则它们就不属于一个聚合

  • 强一致性模型与最终一致性模型是两种不同的数据一致性模型,这里的模型可以理解为数据库系统与开发者之间的契约(Contract)。强一致性模型是指,开发者只要按照数据库系统的某些规则来做,就可以保证数据绝对不会不一致。最终一致性模型是指,开发者按照一定的规则来做,数据库中的数据项在处理“过程中”可能会出现不一致,但是在处理过程结束后,它们最终可以达到一致。

服务

  • 系统中有一些行为是不适合“归属于”哪个对象的,DDD建议把这样的行为定义为服务(Service)。或者说,当有一个操作需要修改多个聚合实例的状态时,这个操作就很有可能应该被定义为服务

限界上下文

  • 顾名思义就是限定了边界的上下文,它定义了每个模型的应用范围。在本书的行文中,经常会把限界上下文简称为“上下文”。

  • 限界上下文的拆分: 判断大小是不是合适,要看应用的开发团队能在一个多大的范围内掌控软件的概念完整性,只要开发团队没有问题,那么这个范围就算再大,作为一个上下文来处理都是可以的。

限界上下文与微服务

  • 限界上下文是概念的边界,微服务是物理的软件组件

防腐层

  • 对于采用六边形架构的应用来说,防腐层一般是作为适配器来实现的

统一语言

  • 统一语言使用模型作为语言的主干,团队在进行所有的交流时都应该使用它。在共享知识和推敲模型时,团队在PPT、文字和图形中使用它。程序员在代码中也要使用它

ER模型、OO模型和关系模型

  • ER模型(实体关系模型)。读者如果有兴趣,可以通过Wikipedia了解一下ER模型,以及相关的概念数据模型、逻辑数据模型、物理数据模型等。
  • OO模型(面向对象模型)。这可能是大多数开发人员最熟悉的一种程序设计模型了
  • 关系模型。这是我们常见的关系型数据库系统(RDBS)所采用的模型,大部分应用软件使用的数据库都是关系型数据库

概念建模与模型范式

  • 概念建模,主要是选择忽略领域中那些相对不太重要的细节,只留下最关键的部分,这与使用的模型范式无关