什么是领域驱动设计 (DDD)? [关闭]

Posted

技术标签:

【中文标题】什么是领域驱动设计 (DDD)? [关闭]【英文标题】:What is Domain Driven Design (DDD)? [closed] 【发布时间】:2010-11-16 09:10:07 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

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

DDD 还推荐了几种模式:

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

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

【讨论】:

哇...多么棒的回复!非常感谢,也是我在任何地方读到的最好的解释。谢谢..我明天会下载那本书。 “聚合根是拥有其他对象的对象。这是一个复杂的概念,并且基于有些对象只有拥有所有者才有意义。”我认为它可能这里是误解,你提到的想法是“Whole Value”,而Aggregate更关心事务边界,所有业务不变规则都需要在这里执行。 老实说,这听起来就像每个开发人员与架构师合作超过一个月的项目。 (嗯,至少根据我的经验。)这种认识让我更加欣赏你的回答。 :) 我不同意 DDD “仅适用于大型项目”的说法。 DDD 不是您必须完全或根本不做的事情。你可以从 DDD 做一些练习。例如,你可以只做“价值对象”和“无处不在的语言”,而不是在一个小项目中做聚合根。 顺便说一句,我们不是对我们所做的每个项目或模型进行域分析。作为 BA,我们是否已经与客户和 SME 进行了永无止境的对话,以了解项目领域和范围?我仍然不明白 DDD 与其他任何软件开发项目相比有什么特别出色的地方?【参考方案2】:

以 *** 为例。与其开始设计一些 Web 表单,不如先集中精力对问题域中的实体进行面向对象的建模,例如用户、问题、答案、投票、评论等。因为设计是由问题的细节驱动的领域它被称为领域驱动设计

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

【讨论】:

Eric Evans 的书有一个短版available for free。 但是老实说,谁会从设计表单开始呢?任何受人尊敬的学术课程都会根据业务需求进行分析、设计和建模应用。我只是不明白这种技术有什么新东西。 我也是,这只是一个面向对象的设计,甚至在这个概念出现之前就被所有人使用。我在这里看不到任何新发明。 @RonenFestinger 请不要仅通过这个答案来判断 DDD。 Eric Evans 的书中有很多见解。例如有界上下文。限界上下文范式是我们今天构建的微服务的支柱之一。阅读本书还可以帮助您了解微服务。 @troelskn,这个简短的版本本身有 106 页

以上是关于什么是领域驱动设计 (DDD)? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

什么是领域驱动设计? [关闭]

干净的领域驱动设计(DDD)是乌托邦吗? [关闭]

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

有没有使用 DDD(领域驱动设计)的开源项目? [关闭]

领域驱动设计-什么是领域驱动设计和怎么使用它

浅谈我对DDD领域驱动设计的理解