Domain driven design 为什么可以';我不能使用ERD为我的域建模吗?

Domain driven design 为什么可以';我不能使用ERD为我的域建模吗?,domain-driven-design,data-modeling,modeling,Domain Driven Design,Data Modeling,Modeling,我对这一讨论还相当陌生,但我不得不提出这个问题,即使这听起来有点“无知”。为什么我们现在如此强调DDD。我越是研究DDD,我的应用程序就越复杂。然而,使用数据库对域进行建模有助于保持应用程序跨层的一致性。然后我可以使用DAL助手,如亚音速或L2S,轻松访问该模型。这有什么不好?甚至在企业应用程序中 当我们有一个经过尝试和测试的领域时,为什么我们要努力创建一种新的领域建模方法 我愿意听取这里的纯粹主义者的意见。你不能推销旧的方法论,因为太多的项目失败了,太多的人知道旧的方法论。必须有一个新的上市

我对这一讨论还相当陌生,但我不得不提出这个问题,即使这听起来有点“无知”。为什么我们现在如此强调DDD。我越是研究DDD,我的应用程序就越复杂。然而,使用数据库对域进行建模有助于保持应用程序跨层的一致性。然后我可以使用DAL助手,如亚音速或L2S,轻松访问该模型。这有什么不好?甚至在企业应用程序中

当我们有一个经过尝试和测试的领域时,为什么我们要努力创建一种新的领域建模方法


我愿意听取这里的纯粹主义者的意见。

你不能推销旧的方法论,因为太多的项目失败了,太多的人知道旧的方法论。必须有一个新的上市

如果你用老方法做得很好,那么就用有效的方法。一定要注意新事物,因为会有一些非常好的想法出现。但这并不意味着一切旧的东西都是坏的和愚蠢的。通常,您可以在很大程度上将新想法融入旧模型中


现在确实是采取行动的时候了。就像我不会对结构和函数指针进行OOP一样。;-)

这实际上是一个非常好的问题,简短的回答是“你可以”。我们过去就是这样做的,企业(数据)建模有一个完整的领域。事实上,常见的OOD符号是从ERD演变而来的

然而,我们发现,像这样的数据驱动设计有一些困难,其中最大的困难是数据库的自然结构不一定与代码的自然结构很好地匹配

在很大程度上,OOD源于这样一种愿望,即更容易找到一种代码结构,该代码结构具有两个理想的属性:

  • 设计应该很容易想出来
  • 它应该在变化中保持稳健
易于思考的设计最初来自Simula,它专门使用我们现在认为的“对象”进行模拟;在模拟中,拥有与正在模拟的事物相对应的软件实体是很方便的。直到后来,施乐公司的Alan kay等人才将其视为一种更为普遍的结构化方法

关于变化下的稳健性的部分有很多父母,但其中最重要的一个是Dave Parnas,你写了几篇论文,确定了模块化的基本规则,我称之为Parnas定律:每个模块都应该保守秘密,这个秘密是一个可能发生变化的需求

事实证明,通过将帕纳斯定律与Simula的“对象”概念相结合,将其与现实世界中可以识别的事物相对应,您可以得到比我们以前的做法更健壮的系统设计。(不总是这样,有时你必须像命令模式那样狡猾。大多数对象是名词,是持久存在的东西。在命令模式中,理想的对象是动词,是你所做的事情。)


然而,它也证明了这种结构不一定是表示关系数据库中底层数据的好方法,因此我们最终得到了“对象-关系阻抗不匹配”问题:如何表示从objectland到database land的转换。

简短回答:如果您只需要一个允许用户编辑数据的CRUD系统,只需构建一个后端数据库的Access前端(或使用您提到的脚手架框架),就可以了。与域驱动系统相比,您应该能够节省70%的预算

详细回答:对于数据驱动的设计,业务模型的实现是什么样子的?通常,在为应用程序构建新功能几年后,您会发现它无处不在:表、视图、存储过程、各种应用程序服务、代码隐藏文件、演示者/视图模型等,到处都有重复。当您与领域专家就他们正在请求的新功能进行对话时,您总是试图将业务语言转换为实现周围的语言,而这根本无法转换

最终通常会发生的情况是,您被迫与业务部门就系统的实现进行沟通,而实现成为业务部门和开发人员在沟通时被迫使用的“普遍语言”。这会产生广泛的后果。业务领域的专家开始相信他们是实现领域的专家,他们开始要求实现方面的特性,而不是他们试图解决的业务需求

此外,您会发现大多数数据驱动的实现并不遵循领域的“概念轮廓”,系统的组件在如何将它们组合在一起以解决问题方面也不是很灵活,因为它们没有与业务模型中的概念一一对应。当代码没有内聚性时,更改和新特性可能需要在整个实现中进行修改

域驱动设计提供了使您的实现与业务模型非常相似的工具,使每个人都能轻松地使用业务语言。它允许您编写测试您的实现的“可执行规范”,但实际上您的领域专家可以理解它