【问题标题】:Domain-Driven Design: Is a Subdomain a class?域驱动设计:子域是一个类吗?
【发布时间】:2019-09-17 15:51:56
【问题描述】:

假设我们使用 OOP。

子域是一个类吗?限界上下文是一组仅出于目的(理想情况下)一起使用的类?子域上可以包含一组类吗?如果是,那么有界上下文有什么区别?

例如,我们有一个域:在线商店。

我们将在线商店分为 2 个子域:客户支持和购物。

我们看到这样的划分还是很大的,所以我们划分:

  1. Customer、Supporter、Ticker 子域中的客户支持。现在这样的子域变成了类,分割的子域变成了有界上下文。
  2. 在客户、购物车、支付子域中购物。现在这样的子域变成了类,分割的子域变成了有界上下文。

可能它不是子域的最佳示例,但重点是让您了解我的问题

【问题讨论】:

    标签: oop domain-driven-design


    【解决方案1】:

    最近我阅读了 Vaughn Vernon 的实施领域驱动设计,我强烈推荐你阅读这本很棒的书。这就是我根据这本书用几句话定义这些概念的方式:

    - 组织做什么;专业知识和不同的行动。领域是有界上下文作为解决方案的问题。

    子域 - 域的一部分。

    有界上下文 - 明确的边界与特定的普遍存在的语言。当每个子域都有自己的有界上下文时最好。应该尽可能大,以表达其整个无处不在的语言。

    但肯定还有很多话要说。

    【讨论】:

    • 我读过很多次这样的定义。我只是不明白当我在 OOP 中为子域建模时,它只是一个类吗?如果有很多类,即子域,它是有界上下文还是仍然是包含其他子域的子域(听起来很奇怪)?
    • 子域不是一个类。子域是组织工作的一部分。它是专业知识和行动的一部分。甚至不需要子域中的软件和计算机。业务问题的解决方案,在您的代码中实现的模型可以包含许多不同的模块或类。当您使用 DDD 时,您可以使用它的战术模式,然后使用聚合、值对象等。再次,我强烈建议您阅读 Vaughn Vernon 的书。
    • 如果我将子域实现为多个类,即我将其建模为多个模型,那么与限界上下文有什么区别?
    【解决方案2】:

    我会试着解释一下,你在搞混。

    • 子域:属于问题空间。在这里,您没有课程或任何有关编程语言的内容。你有概念、关系……当你必须解决一个问题时,你就有了那个问题的领域。如果这个问题很广泛,你可以把它分成更小的子问题,这些子问题也是问题。所以子域是子问题的域。

    • 有界上下文:属于解空间。在这里,您确实有类或任何其他编程语言的工件。如果您有问题,BC 是实现和解决该问题的应用程序。您对问题的领域进行建模,这样您就有了领域模型。理想情况下,BC 将 1:1 与子域相关联。

    BC 只是一个类还是其中很多,这取决于您将域拆分为子域时的粒度,以及您如何对子域进行建模。 BC 应该有多少个班级没有任何规定。

    希望我的解释有所帮助。

    【讨论】:

      【解决方案3】:

      子域可能不是一个类。

      <shameless plug> 这是我书中的摘录: </shameless plug>

      域是我们模型关注的总区域。无论域的大小如何,您都很可能会遇到域模型的不同部分属于一起的情况。与大多数事情一样,我们将分而治之。

      尽管域中的以下部分根据您对它们的看法而被赋予了特定的名称,但它在很大程度上是学术性的。我们不应该为此分心,如果您开始将域分组为逻辑单元并将每个域称为 子域,那么一开始绝对没问题。

      核心领域

      这是您的域的主要部分,最重要。就股票市场的说法而言,这正好属于头条盈利空间。它是您的域的存在理由。这部分必须工作并且必须工作良好,并且是你的系统中一切都围绕着的部分。如果您很难确定这一点,则意味着您拥有一个相当大的核心域。就是这样。

      通用子域

      这些有助于以通用方式执行某些任务,并且实现细节对我们的核心领域并不重要。财务会计和计算引擎可以自行购买并用于执行这些功能。

      支持子域

      我认为通用子域和支持子域之间经常存在混淆。支持的子域不够通用,您可能会找到任何现成的可用东西。它会非常具体地满足您的业务需求,但仍不属于业务核心。

      【讨论】:

      • 子域模型呢?可以只有一个类吗?可以是多个类吗?
      猜你喜欢
      • 2012-06-08
      • 1970-01-01
      • 2023-02-02
      • 1970-01-01
      • 2011-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-29
      相关资源
      最近更新 更多