基于DDD编程的最佳实践

331 阅读3分钟

基于DDD的方法编程,有两个要点: 一是保持代码和模型一致; 二是符合通用的编程原则和最佳实践。

1.保持代码和模型一致

DDD 强调,在代码编写阶段,如果发现模型的问题,要及时修改模型,始终保持代码和模型的一致。

2.通用编程原则和最佳实践

2.1应该采用贫血模型还是充血模型?

贫血模型指的是领域对象中只有数据,没有行为,由于过于单薄,就好像人贫血了一样,显得不太健康。这种风格违背了面向对象的原则。 贫血模型和充血模型在业界没有标准,导致术语混乱。 因此,为了避免混淆,不采用“充血模型”这个词。 在后面的讨论中:

  • 把贫血模型称为面向过程或者过程式编程,
  • 把富领域模型称为面向对象或对象式编程, 因为真正的面向对象本来就是包含丰富逻辑的。

如果面向对象真的明显好于面向过程,为什么多数人还在用面向过程呢? 底层逻辑是什么呢?

早期的面向对象编程,主要是用来开发桌面软件的,比如说开发一个 Office、一个 IDE 等等。这类软件的特点是基本上整个软件的数据都能装入内存,这样就可以通过对象之间自由的导航实现复杂的逻辑。

但是企业应用则有一个本质的不同,就是数据主要在数据库里,每次只能把一小部分远程拿到内存,所以不能在内存里对对象进行自由地导航。这个区别就造成,早期的面向对象编程很难直接用在企业应用,间接导致了贫血模型的普及。

早年,很多像 Martin Fowler 这样的专家认为面向对象就是王道,我把他们称为面向对象的“原教旨主义者”。但是到了今天,包括 Martin Fowler 在内的很多人已经成长为编程范式的“中立主义者”,也就是并不局限于面向对象,而是将面向对象、面向过程、面向方面、函数式等等编程范式结合起来。

实际上,面向对象和面向过程并不是非黑即白的关系,而是像下面这张图这样: image.png

通常在纯面向过程和纯面向对象之间,要找平衡,推荐点原则:在领域对象不直接或间接访问数据库的前提下,尽量面向对象。

2.2 通过开卡和验卡需求理解不一致的实践。

开卡:开发人员动手之前,把需求理解和领域专家再沟通一次;避免需求遗漏和偏差。 验卡:开发完成提测之前,再和领域专家、测试沟通一下,避免偏差。 通过上述实践,输出新的业务规则。

2.3 层间依赖原则和依赖倒置

整理出总体逻辑结构图,发现类之间的依赖关系。 按适配器层依赖应用层,应用层依赖领域层的原则发现问题。

  • 通过把适配器层的DTO对象移到应用层,解决应用层依赖适配器层的问题。
  • 通过在领域层定义接口,解决应用层依赖适配器层的问题。

image.png

极客时间《手把手教你落地DDD》学习笔记 Day10