什么是领域驱动设计?

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

78399 次浏览

以StackOverflow为例。而不是开始设计一些web表单,你首先集中在做面向对象的建模的实体在你的问题领域,例如用户,问题,答案,投票,评论等。由于设计是由问题域的细节驱动的,所以它被称为领域驱动设计

你可以在埃里克·埃文斯的书中阅读更多。

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

假设你还在阅读这篇文章,我对DDD的看法是:

DDD是关于尝试使您的软件成为现实世界系统或过程的模型。在使用DDD时,你必须与能够解释真实系统如何工作的域专家密切合作。例如,如果您正在开发一个处理赛马投注的系统,您的领域专家可能是一位经验丰富的庄家。

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

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

  • 值对象,它们表示一个可能有子部分的值(例如,一个日期可能有日、月和年)
  • 实体,它们是带有身份的对象。例如,每个Customer对象都有自己的标识,因此我们知道具有相同名称的两个客户不是同一个客户
  • 聚合根是拥有其他对象的对象。这是一个复杂的概念,它的原理是,有些对象没有所有者就没有意义。例如,“Order Line”对象如果没有属于“Order”就没有意义,因此我们说Order是聚合根,而Order Line对象只能通过Order对象中的方法进行操作

DDD还推荐了几种模式:

  • 存储库,一个持久化的模式(保存和加载你的数据,通常是到数据库或从数据库)
  • 工厂,对象创建模式
  • 服务,一种用于创建对象的模式,该对象操作您的主域对象,而不是域本身的一部分

现在,在这一点上,我不得不说,如果您以前没有听说过这些东西,那么您不应该在任何有最后期限的项目上尝试使用DDD。在尝试DDD之前,你应该熟悉设计模式企业设计模式。知道这些会使DDD更容易掌握。而且,如上所述,InfoQ提供了DDD免费介绍(在那里您还可以找到关于DDD的讨论)。