【问题标题】:How much realistic should be a model in domain driven design? [closed]领域驱动设计中的模型应该有多现实? [关闭]
【发布时间】:2016-04-12 05:03:49
【问题描述】:

在 Eric Evans 关于领域驱动设计的书中写道:

领域建模不是将模型制作为“现实”的问题 可能的。即使在有形的现实世界中,我们的模型也是 人工创作。也不只是软件的构建 提供必要结果的机制。

现在我有两个问题:

  1. 是否应该设计模型 不知何故,它可以演变成一个更 随时需要的逼真形状 在之前的迭代中不触及核心模型?
  2. 如果上一个问题的答案是肯定的,我可以从哪里学习如何创建逼真的核心模型?
  3. 同样,如果问题的答案是可能的,那么有一天我们的模型会反映世界上的任何问题吗?

【问题讨论】:

  • 您应该考虑一下模型这个词的含义。模型是对现实的简化。如果您想要一个与现实一样复杂的模型,那么您可能做错了。

标签: domain-driven-design software-design


【解决方案1】:

Domain Model 应该是not reflect real world。 根据上下文,它应该只显示一种观点。

假设我们有一个glass

  • 可能有人会想,它是一个玻璃杯,我们可以装满水。使用to drink
  • 其他人可能会认为,这是一个产品,我们可以sell it
  • 另一个人可能会说,玻璃一个库存物品。我不在乎它看起来如何,但我得到了how many 眼镜。

根据上下文,我们model glass differently。它仍然是同一个玻璃杯,但意味着别的东西。

您可以在 Udi Dahan 的博客上找到与该主题相关的所有信息。
更多关于建模现实的主题,可以在这里找到Don’t try to model the real world, it doesn’t exist.

【讨论】:

  • 非常感谢。这是迄今为止最好的答案。现在我有了更好的看法。让我给你举个例子。我被要求创建一个电子商店,我首先创建了一个概念表,其中一行是苹果,另一个名为 conceptInstances 的表指向概念,然后另一个名为提供实例的表指向概念实例。当用户想添加一些苹果提供给买家时,他说我想卖一些苹果,应用程序问他有多少苹果(因为苹果概念有重量)等等。这种方法是错误的吗?
  • 它并没有给我太多的洞察力。我猜你正在考虑数据而不是行为。在 DDD 中,你不要从数据库表开始,因为它会让你的领域模型 anemic 专注于对象的行为,leave the data 在你身后直到你知道 model interact 是如何工作的。而且,如果您需要在开始时拥有数据库,您应该回到蓝皮书,它不会那样工作。我向您推荐 Vaughn Vernon 的 Red Book,从它开始比从 Blue Book 开始要简单得多。
  • 感谢您的回答。我读了贫血的反模式。我还不明白为什么我们不应该有一个名为 Glass 的类和一个名为 volume 的属性。从任何角度来看,眼镜不都是容纳一定体积液体的物体吗?然后我使用装饰器模式添加不同的上下文。为什么这么糟糕?
  • “从任何角度来看,眼镜不就是用来容纳一定体积液体的物体吗?”不。从卖家的角度来看,他不在乎,如果你把液体放在里面,或者你把它作为装饰品放在你的桌子上。他只关心奖品,仅此而已。而不同的上下文,就是不同的子域。在一种情况下,您拥有具有特定边界的模型,您不会使用装饰器模式来装饰模型以移出边界。阅读本文以获得更多概述:gorodinski.com/blog/2013/04/29/…
【解决方案2】:
  1. 是否应该以某种方式设计模型,使其可以在需要时演变为更逼真的形状,而无需触及核心模型 上一次迭代?

不,模型应该反映正在考虑的特定问题。如果潜在问题发生变化,模型应该反映它。假设您为酒店预订系统、仓库系统或商店销售点系统建模,您的模型应该代表这些领域中的当前 概念以及它们之间的交互。模型不会随着时间的推移而版本化。

2 和 3

没有。

【讨论】:

  • 你有3的证据吗?
  • @MohammadRahmani 你的抽象应该尽可能地接近你的领域,而不是试图解决所有潜在的即将出现的问题。广泛的抽象将为您的域提供更大的灵活性,但也会将您的代码拖离域。您应该始终努力获得正确的平衡。不过,如果您的抽象以领域概念命名,那么危害可能会更小。
  • @plalx 谢谢。让我给你举个例子。我被要求创建一个电子商店,我首先创建了一个概念表,其中一行是苹果,另一个名为 conceptInstances 的表指向概念,然后另一个名为提供实例的表指向概念实例。当用户想添加一些苹果提供给买家时,他说我想卖一些苹果,应用程序问他有多少苹果(因为苹果概念有重量)等等。这种方法是错误的吗?
  • @MohammadRahmani 这与您最初的问题有何关系?在不了解您的域的更多信息的情况下,我们无法告诉您这是否是一种错误的方法。
  • Aryeh @guillaume31 请在已接受答案的 cmets 中关注我与 daris 的对话。
【解决方案3】:

在一个问题域中,有明显的东西和隐藏的东西。

如果您只是对明显的、明显的概念(无论是现实世界的对象还是无形的概念)进行建模,为每个概念创建一个类,您将拥有一个现实的模型,但它会错过重点。它不会是一个深刻的、有洞察力的领域模型。

要超越单纯的现实主义,您应该与领域专家坐在一起,并尝试发现问题空间中隐藏的东西,这将有助于解决方案空间 - 您的应用程序。

例如,与铁路交通专家交谈时,您可能会发现火车出发和到达的安排方式中的启发式或属性,即使是专家之前也没有意识到或命名。命名这些事物将使您能够对它们进行推理并最终在您的应用程序中对它们采取行动。或者,您可能在房间里有一头大象 - 一个大而广泛使用的历史概念 - 并决定从您无处不在的语言中拒绝它,因为它没有足够准确地描述问题的子部分。

现实这里的意思是相对于精致、合理化,而不是完全虚构

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 2015-05-30
    • 1970-01-01
    • 2010-09-11
    相关资源
    最近更新 更多