问题:我一直在研究Robert C. Martin的Clean Architecture(CA),发现它对于促进大型应用程序的架构标准非常有用。通过实施案例研究,我对如何使用它来帮助构建更灵活,健壮和可扩展的应用程序有一些经验。最后,我还解决了它的潜在缺点(在 此 回答中概述了其中的许多缺点)。
不过,我的问题是Eric Evans提出的域驱动设计(DDD)与“干净架构”有何关系。尽管对DDD不太熟悉,但我注意到DDD和CA之间有许多相似之处。所以这是我的问题:
从研究中,我唯一能找到的就是CA“从 此处获取 了对业务对象使用更高级别的抽象” 。
回答:两者都集中于将域代码与应用程序和基础结构代码分开。但这就是相似之处结束的地方。
在Clean/Hexagonal/Onion(或简称CHO,分别代表干净架构、六边形架构和洋葱架构)架构中,这种脱钩的目标是可测试性和模块化,其预期效果是可以将我们软件的“核心”与世界其他地区隔离开来。
在DDD中,主要目标是与业务专家建立通用语言。域与其余应用程序代码的分离只是此主要目标的副作用。关于将类设计为实体和聚合也有一些发言权,但这仅在域本身内。关于域代码之外的设计,它无话可说。
在实践中,您可能会发现您同时使用两者。您使用CHO体系结构来设计系统的整个结构,而“域核心”则被隔离在单独的模块中。然后,您可以使用DDD与领域专家协作,并可能使用诸如实体和集合之类的DDD概念来设计此领域核心。
其他回答:DDD是一种尝试通过应用某些策略和策略来帮助您决定如何开发某些软件的范例。理解域并在您的代码中创建一个模型是基础部分,该代码使用领域术语来实现域逻辑。这样,以领域为中心的设计可以帮助实现和开发您的领域逻辑。
作为以域为中心的架构的一个示例,干净的架构是一种结构化代码以在演化过程中实现某些属性的特定方法。特别地,域层可以用于实现如上所述的域逻辑。CA会告诉您域层在软件设计中的位置,以及依存关系应如何跨层流动。
DDD仅声明您应该在代码中反映您的域模型,而DDD却没有告诉您如何像CA一样将其与其余代码分层组织。CA并没有告诉您如何像DDD那样使用战略或战术模式来使其与领域保持一致。如果一起使用,CA会定义域层是其中一部分的代码的整体结构,而DDD会告诉您如何查找域层的详细信息。
banq回答:Clean架构是DDD的实现落地到软件的手段,DDD是从业务需求抽象出实体领域模型(类似代表数据库表模型的实体对象,但区别于它们的是有业务行为,充血模型与失血模型的区别),而CHO则是帮助这些业务实体模型生长在软件技术环境中,DDD是一棵植物或种子,CHO是土壤花盆,当然CHO是一种特殊的土壤和花盆,能够有利于植物生根,不会对植物生长有侵入干扰,好的技术架构不应该污染或侵入业务模型,这是它们两个的统一宗旨和共识。