什么是领域驱动设计?

问题描述 投票:163回答:5

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

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

domain-driven-design
5个回答
94
投票

编辑:

由于这似乎是谷歌的最佳结果,我的答案不是,请参考这个更好的答案:

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

老答案(不是那么完整:))

为了创建好的软件,您必须知道该软件的用途。除非您对银行业务的理解有充分的了解,否则您无法创建银行业务软件系统,必须了解银行业务领域。

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

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

Register to download a summary of the book,或download the summary directly


35
投票

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

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

领域驱动设计的流程方面涉及领域专家,了解问题领域的人员以及了解解决方案领域的设计/架构专家之间的协作。我们的想法是拥有一个共享语言的共享模型,以便来自这两个不同领域的人们以两个不同的视角讨论解决方案,他们实际上正在讨论共享知识库与共享概念。

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

它不仅仅是一个对象模型。重点是共享通信和改进协作,以便发现问题域中的实际需求并创建适当的解决方案以满足这些需求。

Domain-Driven Design: The Good and The Challenging提供了以下评论的简要概述:

DDD有助于发现顶级架构,并告知软件需要复制的域的机制和动态。具体而言,这意味着完善的DDD分析可以最大限度地减少领域专家和软件架构师之间的误解,并减少随后的昂贵变更请求数量。通过在较小的上下文中分割域复杂性,DDD避免强迫项目架构师设计膨胀的对象模型,这是在编制实现细节时浪费了大量时间 - 部分原因是要处理的实体数量经常超出会议室白板的大小。

另见本文Domain Driven Design for Services Architecture,它提供了一个简短的例子。本文提供了域驱动设计的以下缩略图描述。

Domain Driven Design主张基于与我们的用例相关的业务现实进行建模。由于它现在变得越来越老,炒作水平越来越低,我们中的许多人都忘记了DDD方法确实有助于理解手头的问题并设计软件以达到对解决方案的共同理解。在构建应用程序时,DDD将问题称为域和子域。它描述了作为有限上下文的独立步骤/问题领域,强调了讨论这些问题的通用语言,并添加了许多技术概念,如实体,值对象和聚合根规则以支持实现。

Martin Fowler撰写了许多文章,其中提到了Domain Driven Design作为一种方法。例如,本文BoundedContext概述了域驱动开发的有界上下文概念。

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


12
投票

您只能通过首先理解以下内容来理解域驱动设计:

什么是域名?

构建系统的字段。机场管理,保险销售,咖啡店,轨道飞行,你的名字。

应用程序跨越多个不同的域并不罕见。例如,在线零售系统可能在运输领域工作(根据项目和目的地选择适当的交付方式),定价(包括促销和用户特定的定价,比如地点)和建议(计算相关)产品按购买历史记录)。

什么是模特?

“对手头的问题有用的近似。” - 格里苏斯曼

员工类不是真正的员工。它模拟真正的员工。我们知道该模型并未捕获有关真实员工的所有信息,而这并非如此。它只是为了捕捉我们对当前环境感兴趣的东西。

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

什么是域名模型?

域的模型。

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

这是一种深入评估域模型并将其连接到实现的开发方法。 DDD是由Eric Evans创造并最初开发的。

here剔除


11
投票

这是另一篇很好的文章,你可以查看Domain Driven Design。如果你的申请比大学任务严重。基本前提是构建实体周围的所有内容,并拥有强大的域模型。区分提供基础设施相关事物(如发送电子邮件,持久数据)的服务和实际执行核心业务需求的服务。

希望有所帮助。


1
投票

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

类似的方式当系统分析师,产品所有者,开发团队和代码 - 代码 - 实体/类,变量,函数,用户界面进程使用相同的语言进行通信时,其称为域驱动设计

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

使用DDD模型系统有很多种方法

  • 事件采购(使用事件作为单一事实来源)
  • 关系数据库
  • 图数据库
  • 使用函数式语言

Domain object:

用非常天真的话说,一个对象

  • 具有基于业务流程/流程的名称
  • 完全控制其内部状态,即暴露操纵状态的方法。
  • 始终在其使用的上下文中满足所有业务不变量/业务规则。
  • 遵循单一责任原则
© www.soinside.com 2019 - 2024. All rights reserved.