什么是域驱动设计?


198

有人可以(简洁)解释什么是域驱动设计?我看到这个词很多,但真的不明白它是什么或看起来像什么。它与非域驱动设计有何不同?

另外,有人可以解释什么是域对象吗?域与普通对象有何不同?




这回答了你的问题了吗?什么是域驱动设计(DDD)?
星期六

Answers:


112

编辑:

由于这似乎是Google的最佳结果,而我的以下回答却不是,请参考以下更好的答案:

https://stackoverflow.com/a/1222488/1240557

旧答案(不太完整:)

为了创建好的软件,您必须知道该软件的全部含义。除非您对银行业务的全部内容有充分的了解,否则您不能创建银行软件系统,而您必须了解银行业务的领域。

来自:Eric Evans的域驱动设计。

这本书在描述DDD方面做得很好。

注册以下载本书的摘要,或直接下载摘要


迷你版是很好的参考,即使手头上有全文,我也觉得很有帮助。我通常会先阅读它,然后再阅读本文以获取更多详细信息。
Kyri Sarantakos 2011年

15
因此,我从“阅读本书”的答案中得出,不可能仅用几段来总结DDD?设计理念如何如此复杂?
罗宾·温斯洛

我不会说这是不可能的,但是我认为有更好的地方可以阅读它,而Eric Evans的书是imo的最佳来源,那么为什么在这里重复它呢?
MikaelÖstberg'14

6
亲爱的读者:如果您和我一样,都是从Google搜索结果的顶部来到这里的,并且很失望地找到公认的答案,以至于如此动容(道歉,Mikael),请不要担心,SO上有更多令人满意的解释:stackoverflow.com/a/1222488 / 1240557
kryger '16

3
在那里,我使用链接更新了答案。那是一个更好的答案。谢谢!
MikaelÖstberg'16

41

域驱动设计是开发复杂系统的方法和过程处方,其重点是将问题域内的活动,任务,事件和数据映射到解决方案域的技术工件中。

域驱动设计的重点是理解问题域,以便创建问题域的抽象模型,然后可以在一组特定的技术中实现该模型。域驱动设计作为一种方法论,为模型开发和技术开发如何产生一个满足使用它的人们需求的系统提供了指导,同时在面对问题领域的变化时也很健壮。

域驱动设计的过程端涉及领域专家(了解问题领域的人员)与设计/体系结构专家(了解解决方案领域的人员)之间的协作。这个想法是要使用一种共享的语言共享模型,以便当来自这两个不同领域的人们以两种不同的观点讨论解决方案时,他们实际上是在讨论具有共享概念的共享知识库。

需要特定系统的人员与正在设计和实施该系统的人员之间缺乏对问题域的共同理解,这似乎是成功项目的核心障碍。域驱动设计是解决此障碍的一种方法。

它不仅仅是拥有对象模型。重点实际上是关于共享通信和改善协作,以便可以发现问题域内的实际需求,并创建满足这些需求的适当解决方案。

域驱动的设计:优点和挑战提供以下内容的简要概述:

DDD可帮助发现顶层体系结构,并提供有关软件需要复制的域的机制和动态信息。具体来说,这意味着精心设计的DDD分析可以最大程度地减少领域专家和软件架构师之间的误解,并减少随后的昂贵变更请求数量。通过在较小的上下文中划分域复杂度,DDD避免了迫使项目架构师设计design肿的对象模型,在这种情况下,制定实施细节会浪费大量时间,部分原因是要处理的实体数量通常会超出会议室白板的大小。

另请参阅本文的服务结构域驱动设计,其中提供了一个简短示例。本文提供了以下域驱动设计的缩略图描述。

域驱动设计提倡基于与我们的用例相关的业务现实进行建模。随着它变得越来越老和炒作水平的降低,我们很多人都忘记了DDD方法确实有助于理解眼前的问题,并朝着对解决方案的共同理解设计软件。在构建应用程序时,DDD会讨论域和子域等问题。它以边界上下文的形式描述问题的独立步骤/区域,强调谈论这些问题的通用语言,并添加了许多技术概念,例如实体,值对象和聚合根规则以支持实现。

Martin Fowler写了许多文章,其中提到了域驱动设计作为一种方法。例如,本文BoundedContext概述了域驱动开发中的受限上下文概念。

在早期,我们被建议建立整个业务的统一模型,但是DDD意识到我们已经了解到“将大型系统的域模型完全统一是不可行或不具有成本效益的” 1。因此,DDD而是将大型系统划分为有界上下文,每个有界上下文可以具有统一的模型-本质上是构造MultipleCanonicalModels的一种方式。


20

只有先了解以下内容,才能了解域驱动的设计:

什么是域名?

为其构建系统的字段。您可以说机场管理,保险销售,咖啡店,轨道飞行。

应用程序跨越多个不同的域并不少见。例如,在线零售系统可能在运输(根据物品和目的地选择适当的交付方式),定价(包括促销和特定于位置的用户定价)以及推荐(计算相关按购买历史记录的商品)。

什么是模特?

“对当前问题的有用近似。” -格里·萨斯曼

Employee类不是真正的雇员。它为真正的员工建模。我们知道,该模型无法捕获有关真实员工的所有信息,这不是重点。这仅是为了捕捉我们对当前上下文感兴趣的内容。

不同的领域可能对以不同方式建模同一事物感兴趣。例如,薪资部门和人力资源部门可能以不同的方式对员工进行建模。

什么是领域模型?

域的模型。

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

这是一种开发方法,它深深地重视领域模型并将其连接到实现。DDD由Eric Evans创造并最初开发。

这里剔除


12

这是另一篇不错的文章,您可以在Domain Driven Design上查看。如果您的申请比大学任务更重要。基本前提是围绕您的实体构建一切,并具有强大的域模型。区分提供与基础架构相关的事情的服务(例如发送电子邮件,持久数据)和实际执行作为您的核心业务要求的事情的服务。

希望能有所帮助。


4

与在TDD和BDD中一样,您/团队最关注系统的测试和行为,而不是代码实现。

系统分析师,产品负责人,开发团队以及当然的代码(实体/类,变量,函数,用户界面流程)使用相同的语言(即所谓的域驱动设计)进行通信时,采用类似的方式

DDD是一个思考过程。在对软件设计进行建模时,您需要将业务领域/流程放在关注的中心,而不是数据结构,数据流,技术,内部和外部依赖性。

使用DDD对系统项建模的方法很多

  • 事件源(使用事件作为单一事实来源)
  • 关系数据库
  • 图形数据库
  • 使用功能语言

域对象:

用非常幼稚的话来说,

  • 根据业务流程/流程具有名称
  • 对其内部状态具有完全控制,即公开用于操作状态的方法。
  • 始终在使用时遵守所有业务不变式/业务规则。
  • 遵循单一责任原则

TDD-

BDD-

DDD-

DDD-

4

DDD(领域驱动设计)是一个有用的概念,可用于分析项目需求并处理这些需求的复杂性。关系虽然不老,但存在一些问题:

  • 在具有复杂需求的大型项目中,这是没有用的,尽管对于小型项目而言,这是一种很好的设计方式。

  • 当您与没有技术概念的技术人员打交道时,这种冲突可能会在我们的项目中引起一些巨大的问题。

因此,DDD处理第一个问题是将主项目视为一个域,并将该项目的各个部分分成一些我们在绑定上下文中比较有名的小块,而每个块对其他块都没有任何影响。第二个问题已经用一种普遍存在的语言解决了,这是技术团队成员和产品所有者之间的通用语言,他们不是技术人员,但是对他们的要求有足够的了解

通常,对Domain的简单定义是为所有者和其他团队赚钱的主要项目。


1

我相信以下pdf文件可以为您提供更大的了解。Eric Evans的域驱动设计

注意:考虑您可以从事的项目,运用您了解的小知识并查看最佳实践。它还将帮助您增强对微服务架构设计方法的能力。


0

我不想重复别人的回答,因此,总之,我解释了一些常见的误解

  • 实用资源:Scott Millett的模式,原理和域驱动设计实践
  • 它是用于复杂业务系统的方法。与业务专家交流时,它消除了所有技术问题
  • 它在整个开发团队中提供了对业务的简化理解和简化模型。
  • 它通过使用普遍存在的语言(整个开发团队,业务专家,业务分析师等使用的语言)使业务模型与代码模型保持同步,该语言用于开发团队内部或与其他团队进行通信
  • 它与项目管理无关。尽管它可以完美地用于敏捷等项目管理方法中。
  • 您应该避免在项目中全部使用它

    DDD强调需要将最大的精力集中在核心子域上。核心子域是您产品的领域,这将是成功与失败之间的区别。这是产品的独特卖点,是产品被制造而非购买的原因。

    基本上是因为需要太多时间和精力。因此,建议将整个域分解为子域,并将其应用于具有较高业务价值的领域。(例如不在电子邮件等通用子域中,...)

  • 它不是面向对象的编程。它主要是解决问题的方法,并且(有时)您不需要在域模型中使用OO模式(例如“四人一组”)。仅仅是因为业务专家无法理解它(他们对Factory,Decorator等了解不多)。DDD中甚至有一些模式(例如“事务脚本”,“表模块”)与OO概念并非100%一致。

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.