Domain driven design 领域驱动设计精确的聚合定义

Domain driven design 领域驱动设计精确的聚合定义,domain-driven-design,ddd-repositories,Domain Driven Design,Ddd Repositories,合计 聚合是一组关联对象,它们被视为数据更改的一个单元。骨料以边界为界 它将内部对象与外部对象分开。每个 聚合有一个根。根是一个实体,它是唯一的 可从外部访问的对象 在快速阅读《DDD》一书时,这是建议的聚合定义。然而,当我在youtube上解析一些视频时,特别是: DDD和REST-用于web的域驱动API-Oliver Gierke 他对总量的定义如下: 实体+存储库=聚合 他还建议我们为每个属性对字符串进行子类化,我认为这与DDD解决复杂性的目标背道而驰。如果我们有100个属性呢 因此,我

合计

聚合是一组关联对象,它们被视为数据更改的一个单元。骨料以边界为界 它将内部对象与外部对象分开。每个 聚合有一个根。根是一个实体,它是唯一的 可从外部访问的对象

在快速阅读《DDD》一书时,这是建议的聚合定义。然而,当我在youtube上解析一些视频时,特别是:

DDD和REST-用于web的域驱动API-Oliver Gierke

他对总量的定义如下:

实体+存储库=聚合

他还建议我们为每个属性对字符串进行子类化,我认为这与DDD解决复杂性的目标背道而驰。如果我们有100个属性呢


因此,我想我的问题是双重的。存储库是聚合的一部分,还是属于基础架构层的聚合持久化工具?第二,增加软件的复杂性和可维护性以实现可读性是谨慎的,还是这个计数器有助于DDD的目标,作为一个整体?

聚合是关于领域的:它代表给定专业领域的特定主题

相反,存储库是一种关心持久性的技术。因此,存储库不属于域,它是一个能够使用聚合的实用程序

因此,不,存储库不属于聚合。您可能还对这方面的详细信息感兴趣

关于你的第二个问题:这很大程度上取决于你的应用程序和你使用的编程语言……如果你使用动态类型语言,比如JavaScript,你仍然可以使用DDD,但是你将无法对事物进行子类化(将ES2015
class
关键字放在一边,因为它不会为ES带来真正的面向对象编程)

除此之外,DDD是一种对领域建模的方法,并允许跨学科团队更好地就这个领域进行交流。它与技术无关(当然,除非你的领域实际上是技术;-)

由于子类化是一个技术问题,它与DDD无关。如果有的话,它与如何实现使用DDD创建的模型有关,但这与DDD本身无关

您可能会感兴趣,它描述了如何进行DDD的方法,以及需要注意的事项

请注意,我是本书的作者之一。因此,请对最后一段稍加保留

存储库是聚合的一部分吗

不,完全分开

用于持久化属于基础结构层的聚合的工具

也不完全是这样

存储库的主要作用是充当应用程序和数据之间的边界。在介绍了具有集合语义的存储库中对存储库的原始讨论;如果数据只是存储在内存集合中,那么存储库的界面与您使用的界面相同

第二,增加软件的复杂性和可维护性以实现可读性是谨慎的做法,还是这种做法总体上有利于DDD的目标

不是“可读性”,而是“沟通”;见本报告第2章

在没有通用语言的项目中,开发人员必须为领域专家翻译。。。。翻译混淆了概念,导致代码的破坏性重构。。。。当一个项目的语言被破坏时,它将面临严重的问题

在这种情况下,复杂性是从领域中提取出来的复杂性——我们可能不应该想象我们可以使用一个或两个领域不可知的抽象,用一千个微妙不同的概念来建模一个领域

你是说你相信仅仅为了可读性而对字符串进行分类,尽管它可能会产生数百个额外的类,但这是一种谨慎的方法,因为它可以作为公共语言的催化剂

当然不是子类化,不是。但我主张为每个独特的概念(在域中)使用一个唯一的名称(在代码中),即使这些概念共享公共表示

选择一个简单的例子,
时间
不是
金钱
,即使在这两者的基本表示形式都是
的情况下也是如此

Scott Wlaschin的包括一个扩展示例。在某一点上,他将验证电子邮件地址和未验证电子邮件地址建模为彼此明显不同;尽管这两个概念都有底层的字符串表示,但他仍然采取步骤为它们中的每一个创建一个大小写联合类型,以便在代码中捕获这两个概念不是相互替代的事实

这种“复杂性”实际上只是将代码工件与领域专家普遍使用的语言对齐


现在,根据您所使用的代码,您的代码工件中可能会有额外的复杂性来创建这些不同的名称;正如Scott所展示的,用F#来表达是非常直截了当的,但用你通常的工作语言可能就不那么直截了当了。我的感觉是,如果您选择的语言在建模中引入了复杂性,那么您应该首先看看是否有其他语言更适合此任务。

非常感谢。这正是我从阅读中提取的内容。我认为,关于DDD是什么、应该如何正确实施以及具体的目标究竟是什么,存在着很多困惑。我一定会复习你推荐的阅读材料。再次感谢。PS:既然你显然觉得答案很有帮助,请你投票,并将其标记为已接受?我已经这么做了,但因为我是这个平台的新手,所以它不适合我