有人可以用简单的英语解释域驱动设计(DDD)吗?

时间:2009-08-03 13:33:52

标签: domain-driven-design

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

2 个答案:

答案 0 :(得分:489)

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

假设你现在还在阅读,我对DDD的看法是:

DDD旨在让您的软件成为真实世界系统或流程的典范。在使用DDD时,您需要与 domain expert 密切合作,后者可以解释现实世界系统的工作原理。例如,如果您正在开发一个处理在赛马上下注的系统,那么您的域名专家可能是一位经验丰富的博彩公司。

在您和域专家之间,您构建了一个无所不在的语言(UL),它基本上是对系统的概念性描述。我们的想法是,您应该能够以域专家可以读取它并验证它是否正确的方式记下系统的功能。在我们的投注示例中,无处不在的语言将包括诸如“种族”,“赌注”,“赔率”等词语的定义。

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

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

DDD还推荐了几种模式:

  • Repository,一种持久性模式(通常是从数据库保存和加载数据)
  • Factory,一种用于创建对象的模式
  • 服务,一种用于创建操作主域对象的对象的模式,而不是域本身的一部分

现在,在这一点上,我必须说,如果您之前没有听说过任何这些事情,那么您不应该尝试在任何有截止日期的项目中使用DDD。在尝试DDD之前,您应该熟悉design patternsenterprise design patterns。了解这些使DDD更容易掌握。而且,如上所述,InfoQ提供了free introduction to DDD(您还可以在其中找到有关DD​​D的说明)。

答案 1 :(得分:32)

以StackOverflow为例。您不必开始设计某些Web表单,而是首先集中精力对问题域中的实体进行面向对象的建模,例如用户,问题,答案,投票,评论等。因为设计是由问题的细节驱动的域称为域驱动设计

您可以在Eric Evans' book中阅读更多内容。