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


276

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

Answers:


595

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

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

DDD旨在使您的软件成为真实系统或流程的模型。使用DDD时,您应与可以解释真实系统工作原理的领域专家紧密合作。例如,如果您正在开发一个处理赛马投注的系统,则您的领域专家可能是经验丰富的博彩公司。

在您自己和领域专家之间,您将构建一种普遍存在的语言(UL),这基本上是系统的概念性描述。这样做的想法是,您应该能够以域专家可以读取并验证其正确性的方式记录系统的工作。在我们的投注示例中,无处不在的语言将包括诸如“种族”,“投注”,“赔率”等单词的定义。

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

  • 值对象,表示可能具有子部分的值(例如,日期可能具有日,月和年)
  • 实体,是具有标识的对象。例如,每个客户对象都有其自己的标识,因此我们知道两个具有相同名称的客户不是同一位客户
  • 聚合根是拥有其他对象的对象。这是一个复杂的概念,其依据是有些对象除非拥有所有者,否则它们是没有意义的。例如,如果没有“订单”所属的“订单行”对象是没有意义的,那么我们说“订单”是集合根,并且“订单行”对象只能通过Order对象中的方法进行操作

DDD还建议了几种模式:

  • 存储库,一种持久性模式(通常将数据保存到数据库或从数据库加载数据)
  • 工厂,对象创建的模式
  • 服务,一种创建对象的模式,该对象可以操作您的主域对象而又不属于域本身

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


33
哇!真是太好了!非常感谢,我在任何地方都读过最好的解释。谢谢..我明天下载那本书。
leen3o

3
“聚合根是拥有其他对象的对象。这是一个复杂的概念,其依据是有些对象除非拥有所有者,否则它们是没有意义的。”我认为这可能是误解,您提到的想法是“整体价值”,而“聚合”则更关注“交易边界”,因此此处需要执行所有业务不变规则。
super1ha1

6
老实说,这听起来几乎像每个项目中,开发人员与建筑师合作一个多月。(嗯,至少根据我的经验。)哪种认识使我更加感谢您的回答。:)
JaroslavZáruba17年6

4
我不同意DDD仅适用于大型项目的说法。DDD无关紧要,您完全不必执行或根本不执行。您可以通过DDD进行一些练习。例如,您只能执行“值对象”和“普遍语言”,而不能在一个小项目中进行汇总根。
EasterBunnyBugSmasher

6
顺便说一句,我们不是对我们所做或建模的每个项目都进行领域分析。难道我们还没有结束与BA和客户以及SME的对话,以了解项目领域和范围吗?我仍然不明白DDD中还有什么其他杰出的软件开发项目?
超新星

50

以StackOverflow为例。首先,您无需集中精力设计某些Web表单,而是着重于对问题域内的实体进行面向对象的建模,例如,用户,问题,答案,投票,注释等。由于设计是由问题的细节决定的领域称为领域驱动设计

您可以在Eric Evans的书中阅读更多内容


5
Eric Evans的书籍有免费的简短版本。
troelskn

问题是,您需要有人以足够抽象的方式理解该域,以便他们可以在使用网页之前说出一些有用的信息!如果是这种情况,那就太好了!
伊恩·林罗斯

3
但是,老实说,谁会从设计表单开始?任何可观的学术课程都将根据业务需求进行分析,设计和建模应用程序。我只是不了解这项技术的新功能。
塞巴斯

6
我也是,这只是一个面向对象的设计,甚至在这个概念出现之前就已为每个人使用。我在这里看不到任何新发明。
罗恩·费斯廷格

2
@RonenFestinger请不要仅凭此答案来判断DDD。埃里克·埃文斯(Eric Evans)的书中有很多见解。例如有界上下文。绑定上下文范式是我们今天构建的微服务的支柱之一。阅读本书还可以帮助您了解微服务。
KeremBaydoğan18年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.