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

308

我经常在文章中看到DDD(领域驱动设计)的使用——我已经阅读了关于DDD的维基百科条目,但仍然无法确定它到底是什么以及如何在创建我的网站时实施它?


请随意查看此链接:https://youtu.be/MfEpw2WXXyk - Alireza Rahmani Khalili
2个回答

691
首先,如果您不知道需要它,则可能不需要它。如果您没有意识到DDD解决的问题,那么您可能没有这些问题。即使DDD的拥护者经常指出,DDD仅适用于大型(> 6个月)项目。
假设您仍在阅读此处,我对DDD的看法是:
DDD旨在尝试使您的软件成为现实世界系统或过程的模型。在使用DDD时,您应该与一个domain expert紧密合作,他可以解释现实世界系统的工作方式。例如,如果您正在开发一个处理在赛马中下注的系统,则您的领域专家可能是一位有经验的博彩商。
在您和领域专家之间,您构建了一个普遍语言(UL),它基本上是系统的概念描述。想法是您应该能够以领域专家可以阅读和验证其正确性的方式写下系统所做的事情。在我们的投注示例中,普遍语言将包括诸如“比赛”、“赌注”、“赔率”等单词的定义。
UL描述的概念将构成您面向对象设计的基础。DDD提供了一些明确的指导,指导您的对象应如何交互,并帮助您将对象分为以下类别:
  • 值对象,代表一个可能有子部分的值(例如,日期可能有日、月和年)
  • 实体,是具有标识的对象。例如,每个客户对象都有自己的标识,因此我们知道相同名称的两个客户不是同一个客户
  • 聚合根是拥有其他对象的对象。这是一个复杂的概念,它基于一些对象没有意义,除非它们有一个所有者。例如,“订单行”对象没有“订单”属于就没有意义,因此我们说订单是聚合根,而只能通过订单对象的方法来操作订单行对象

DDD还推荐几种模式:

  • Repository,一种用于持久化(将数据保存和加载,通常是从数据库中)的模式
  • Factory,一种用于对象创建的模式
  • 服务,一种用于创建操纵主域对象的对象的模式,而不是作为域本身的一部分
现在,我必须说,如果您以前没有听说过这些东西,那么您不应该尝试在任何有截止日期的项目上使用DDD。 在尝试DDD之前,您应该熟悉设计模式企业设计模式。 熟悉这些使得理解DDD变得更加容易。 正如上面提到的,InfoQ提供了免费的DDD入门介绍(您还可以在那里找到关于DDD的讲座)。

43
哇...太棒的回复了!非常感激,这是我读过的迄今为止最好的解释。谢谢...我明天会下载那本书。 - YodasMyDad
4
聚合根是拥有其他对象的对象。这是一个复杂的概念,其基本原理是存在一些对象,如果它们没有所有者就毫无意义。我认为这里可能有误解,您提到的概念应该是“整个值”,而聚合更关注事务边界,需要在此执行所有业务不变规则。 - super1ha1
7
说实话,这听起来和开发人员与建筑师合作超过一个月的几乎所有项目都差不多。(至少根据我的经验是这样。)这种认识让我更加欣赏你的回答。 :) - Jaroslav Záruba
4
我不同意"DDD仅适用于大型项目"的说法。DDD并非你必须完全执行或者不执行。你可以只实践DDD中的一些方法。例如,你可以在小型项目中只使用"值对象"和"通用语言",而不需要使用聚合根。 - EasterBunnyBugSmasher
9
顺便问一下,我们不是为每个项目或模型进行领域分析吗?我们难道不已经和客户和专家进行了无休止的对话,以了解项目的领域和范围吗?我仍然不明白DDD在任何其他软件开发项目中有什么非常突出的地方。 - supernova
显示剩余4条评论

58
以StackOverflow为例,不是首先设计一些Web表单,而是先集中精力对问题域内的实体进行面向对象的建模,例如用户、问题、答案、投票和评论等。由于设计受到问题领域细节的驱动,所以称为领域驱动设计。
您可以在Eric Evans的书中阅读更多相关内容。

7
Eric Evans的书有一个简短版免费提供 - troelskn
6
但是,说实话,谁会从设计表单开始呢?任何受人尊敬的学术课程都会根据业务需求进行分析、设计和建模应用。我只是不明白这种技术有什么新的东西。 - Sebas
7
我也这么认为,这只是一种面向对象设计的方法,早在这个概念出现之前就被大家广泛使用。我没有看到任何新的发明。 - Ronen Festinger
2
@RonenFestinger,请不要仅凭这个答案来评判DDD。Eric Evans的书中有很多深入的见解,例如有界上下文。有界上下文范式是我们今天构建微服务的支柱之一。阅读这本书还可以帮助您理解微服务。 - Kerem Baydoğan
1
@troelskn,那个简短版本本身就有106页。 - Hamza Khanzada
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接