是什么让我的代码DDD(域驱动设计)合格?

时间:2010-05-25 19:04:52

标签: architecture domain-driven-design

我是DDD的新手,正在考虑在我的项目中使用这种设计技术。

然而,DDD让我印象深刻的是这个想法有多么基本。与其他设计技术(如MVC和TDD)不同,它似乎没有包含任何突破性的想法。

例如,我相信你们中的一些人会有同样的感觉,根聚合和存储库的想法并不新鲜,因为当你在编写MVC Web应用程序时,你必须拥有一个主对象(即根目录)聚合)包含模型层中的其他次要对象(即值对象和实体),以便将数据发送到强类型视图。

对我而言,DDD中唯一的新想法可能是

  • “智能”实体(即您应该在根聚合上有业务规则)
  • 值对象,根聚合和实体之间的分离。

有谁可以告诉我,如果我错过了这里的任何东西? 如果这就是DDD的全部内容,如果我用上述2个新想法更新我现有的MVC应用程序之一,我可以声称它是TDD,MVC和DDD应用程序吗?

2 个答案:

答案 0 :(得分:14)

简短的回答是,不是你的代码看起来像是DDD项目,它是你如何达到该代码。现在是长版......

对于DDD编码实践没有任何革命性的东西,你是完全正确的,但你似乎对你的问题有点偏离目标。许多开发人员使用DDD的一个常见错误是过多地关注编码实践,而忽略了DDD的一些更基本的概念。 DDD的核心是通过开发人员和领域专家之间的密切合作来迭代开发模型。您可以编写所需的所有服务,实体和值对象,但如果您没有在过程中涉及域专家,或者没有通过迭代改进模型,那么坦率地说,您不是在练习DDD。即使从编码的角度来看,许多人认为聚合根,有界上下文和反腐败层的概念比基本模式更有价值。

你并不是唯一一个了解DDD的人。我发现几乎所有的开发人员都经历了一个DDD阶段,他们试图使用实体,价值对象和服务来实现样本应用程序,同时忽略所有其他对DDD至关重要的实践。 DDD是一个旨在处理复杂业务逻辑的流程,因此判断一个周末开发的示例应用程序的优点并不能让您获得DDD提供的最佳功能。我敦促你继续深入研究DDD,因为我发现它是一个不可或缺的工具,但永远不要忘记它不仅仅是一种模式语言。

答案 1 :(得分:7)

DDD并不是一个真正的清单 - 这是一种方法论。

除了Stefans的答案,我还建议如下(按重要性顺序):

  • 无所不在的语言 - 您的代码 使用与。相同的名称/术语 商业?您的域对象是否使用 和商家一样的名字?
  • 行为 - 是大多数行为/逻辑 直接与域对象关联,或者做 你有很多愚蠢的DTO?
  • 有界上下文 - 您是否已明确定义 责任领域和 关注点分离?
  • 汇总 - 您是否根据根对象识别了聚合,以及实施业务不变量的锁定策略?
  • 存储库 - 是所有数据 访问/查询通过 存储库,或者你有SQL代码 在其他课程?
  • 域名服务 - 你有域服务吗? 不自然的业务逻辑 适合域对象
  • 规格 - 您是否在规格中包含了很好的业务规则?
  • 查询规格 - 您有吗? 预先查询/过滤得很好 在查询规范中包装?

然后还有其他所有东西!

我认为大多数DDD从业者都想说:

我与领域专家一起了解他们的需求,并编写(a)与企业条款和流程相匹配的系统,(b)帮助其他开发人员了解业务领域,以及(c)可以灵活地适应改变业务需求。

希望有所帮助!