小编典典

什么是领域驱动设计 (DDD)?

all

我一直看到 DDD(域驱动设计)在文章中被大量使用 - 我已经阅读了关于 DDD
的维基百科条目,但仍然无法弄清楚它实际上是什么以及我将如何在创建我的网站时实现它?


阅读 135

收藏
2022-04-21

共1个答案

小编典典

首先,如果您不知道自己需要它,那么您可能不需要它。如果您不认识 DDD 解决的问题,那么您可能没有这些问题。甚至 DDD 的拥护者也会经常指出 DDD
仅适用于大型(>6 个月)项目。

假设您此时仍在阅读,我对 DDD 的看法是:

DDD 旨在使您的软件成为现实世界系统或流程的模型。在使用 DDD 时,您需要与能够解释实际系统如何工作的
领域专家密切合作。
例如,如果您正在开发一个处理赛马投注的系统,那么您的领域专家可能是一位经验丰富的博彩公司。

在您和领域专家之间,您构建了一种 通用语言
(UL),它基本上是对系统的概念描述。这个想法是,您应该能够以领域专家可以阅读并验证其正确性的方式写下系统所做的事情。在我们的投注示例中,普遍存在的语言将包括诸如“种族”、“赌注”、“赔率”等词语的定义。

UL 描述的概念将构成您的面向对象设计的基础。DDD 为您的对象应如何交互提供了一些明确的指导,并帮助您将对象分为以下几类:

  • 值对象,表示可能有子部分的值(例如,日期可能有日、月和年)
  • 实体,它们是具有 标识 的对象。比如每个Customer对象都有自己的身份,所以我们知道两个同名的客户不是同一个客户
  • 聚合根是拥有其他对象的对象。这是一个复杂的概念,其工作基础是有些对象只有拥有所有者才有意义。例如,“订单线”对象没有“订单”归属就没有意义,所以我们说订单是聚合根,订单线对象只能通过订单对象中的方法进行操作

DDD 还推荐了几种模式:

  • Repository,一种持久性模式(保存和加载数据,通常到/从数据库)
  • 工厂,一种对象创建模式
  • 服务,一种用于创建对象的模式,这些对象可以操作您的主要域对象,而不是域本身的一部分

现在,在这一点上,我不得不说,如果您以前没有听说过这些事情,那么您不应该尝试在任何有截止日期的项目中使用 DDD。在尝试 DDD
之前,您应该熟悉设计模式企业设计模式。了解这些让
DDD 更容易掌握。而且,如上所述, InfoQ 提供了关于 DDD
的免费介绍
(您还可以在其中找到有关 DDD 的讨论)。

2022-04-21