1. 首页
  2. 后端

DDD(领域驱动设计)之 领域(Domain)

  DDD(领域驱动设计)之 领域(Domain)

=======================

领域驱动设计(Domain-Driven Design,简称DDD)是一种软件开发方法论,它着重于解决复杂业务逻辑的软件系统设计问题。它并非直接定义了一种软件架构模式,而是其核心原则与思想能够指导我们实现诸如分层架构、六边形架构或洋葱架构等实践。这些架构风格可以视为DDD理念在实际项目中的具体应用表现,但它们仅构成了DDD全貌的一部分。因此,深入理解和内化DDD的方法论精髓,对于将其顺利融入并优化我们的软件架构设计至关重要。

DDD(领域驱动设计)是一种针对复杂业务逻辑软件的解决方案。然而,如果您的软件主要涉及基本的数据操作如添加、修改、删除和查询,或者业务流程相对简单,我们不推荐使用DDD架构,因为在这种情况下,它可能会不必要地增加系统实现的复杂程度。

前言

首先,让我们确立一个共识,以此作为后续探讨领域的基础。试想我们的系统如同一家高效运转的工厂,其中每个特定场景下的操作可以比喻为一条条精细的生产流水线。这些流水线通过协同作业,对业务实体(即领域对象)进行逐级加工与塑造。最终,这些经过一系列加工流程的业务实体转化为我们所期望的成品——即领域对象的最终数据形态。这些领域对象在载着数据在界限上下文间传递。

在自然界中,一切事物均可视为对象。因而,在应用DDD(领域驱动设计)时,我们应时刻铭记这一核心观念,即通过对象来抽象和理解世界。

我们来认识对象几个重要的特点:

  • 标识唯一性(Identity):每个实体都具备独一无二的身份标识,这意味着即使两个实体的所有属性完全一致,它们仍然是可以区分的独特存在。正如个人可通过身份证号码来唯一标识一样。
  • 独立性与隔离性:正如我们常强调的“高内聚、低耦合”原则,每个对象都如同一个自给自足的实体,它们各自独立存在。然而,通过精心设计的关联路径,这些对象能够相互连接,形成一个有机的整体。这就好比于人尽管每个人都是独立的个体,拥有自己的思想和生活,但我们通过家庭、朋友、工作等多重纽带,与周遭的人们建立起错综复杂的联系网络。

上述两个对象的特点大家必须牢牢理解,这是对领域模型理解的核心关键。

领域模型(Domain)

在DDD中领域通常又被分为领域(Domain)和子领域(Subdomain)。

领域(Domain)

领域(Domain)是指一个组织从事的所有活动及其涵盖的广袤范畴,它囊括了整个业务体系的精髓。换言之,领域实质上代表了一个特定的业务领域或行业板块,比如电子商务、社交媒介、金融业等。

在软件工程的语境下,对领域进行提炼和抽象化处理,是至关重要的一步。这一过程旨在深化我们对业务需求的认知,让其成为软件设计与实施的指导中枢。领域构建于一系列紧密相连的业务概念、规范、流程及实践活动之上,这些元素协同作用,共同勾勒出业务领域的核心框架。深入探索并建模领域,使我们能够精准地打造出与现实世界业务需求丝丝入扣的软件解决方案。

子领域(Subdomain)

在领域驱动设计(DDD)框架下,领域被细分为多个子领域,而领域模型则在明确界定的限界上下文中得以构建和完善。 子域(Subdomain),作为领域内的组成单元,聚焦于业务领域的一个具体且有限的部分。面对庞大且复杂领域的挑战,通过划分成多个子域来进行设计与实施成为了一种有效策略。每个子域封装了其特有的业务概念、规则及流程,展现出高度的内聚性,这意味着它们能够作为自治的业务组件进行处理。这种结构允许每个子域拥有清晰界定的环境背景和责任范围,便于单一团队或是跨团队合作共同管理和推进。

下述举一个简单的电商平台的例子,用来说明域与子域之间的关系:

生成图片 (1).png

  • 核心域(Sub Domain):它是一个独一无二且界定清晰的业务模型,它要求战略性资源投入,并在明确定义的边界内,用心雕琢共通语言以实现极致优化。这一领域被视为组织内的头等大事,是因为它构成了我们与竞争对手差异化的优势基石。鉴于任何组织都无法在所有领域达到顶尖水平,塑造并强化核心领域成为了构建组织核心竞争力的关键途径。这一决策过程深入且复杂,需要对核心领域有透彻的理解,而这离不开坚定的承诺、团队间的紧密合作以及不断的探索尝试。因此,核心领域成为了组织在软件开发中应当重点倾斜和投资的战略方向。
  • 支撑子域(Supporting Subdomain):这部分内容虽与主营业务相关联,但也包含了一定程度的通用性。因此,针对这一领域,采取采购标准解决方案结合适度定制开发的策略显得尤为合适,毕竟市场上难以找到与自身业务完美契合的现成方案。对其的资源投入显然不能等同于核心领域,级别上存在明显差异。考虑到成本效益,采用项目外包的方式来构建这类界限上下文是一种明智选择,这样做有助于避免因误判其战略价值而过度投资。尽管如此,支撑子领域依然举足轻重,它是确保核心领域能成功不可或缺的一环。。
  • 通用子域(Generic Subdomain):是指那些与特定业务关联较小,但却对系统整体运作至关重要的功能模块。它们大多涉及到系统的非功能性需求,例如日志记录、安全控制等。针对这些通用子域的处理,我们拥有多种策略选择:采纳市面上成熟的标准化产品、委托给外部专业团队进行项目开发,或者由企业内部团队自主实施。值得注意的是,相较于核心业务域,我们不必为通用子域配置同等水平的研发资源,其资源配置甚至可能少于支撑子域,这体现了我们在资源分配上的优先级考虑及效率优化。

子域与微服务划分

在设计应用架构时,采纳微服务架构是当前比较流行的一种架构选择。按照子域来进行微服务的划分,是一个值得推荐的方法,因为它确保了边界清晰、低耦合度以及内部高内聚性,这些特质均符合微服务设计的基本原则。然而,实施过程中需灵活应对,具体划分不应一概而论,而是要综合考量多种因素,例如服务的访问量规模、是否为核心热点服务等多因素影响微服务拆分。实际情况中,可能会出现多个子域合并构建为单一微服务的情形,也可能需要将单个子域进一步细分为多个微服务,以达到最优的系统设计。

最后

领域驱动设计(DDD)作为一种软件开发方法论,是一种理念思想,与微服务架构思想一样,需要去理解这种思想,其精髓在于深入领会其核心思想。唯有透彻理解DDD的思想,开发者方能有效运用这一工具应对实际开发中的种种挑战。初探DDD时,不少人可能会感到无处下手,尤其是那些长期浸润于传统三层架构模式中的开发者,他们常误将DDD的领域层(Domain)等同于三层架构中的服务层(Service)。他俩的关键差异,正是DDD通过领域层所体现的独特之处(后续文章会做一次对比)。 DDD框架的一大特色,在于严格定义了各层级的职责范围与界限,确保每一层都能各司其职。这种精细的分工不仅显著减少了模块间的依赖性,还增强了软件的可扩展性和安全性,为日后的维护与重构工作铺平了道路,带来了前所未有的便利。 尽管市面上关于DDD的文献资料众多,但普遍存在的问题是理论深奥,不易消化。基于我多年的实战积累,我计划逐步揭开DDD的神秘面纱,首先通过通俗易懂的方式阐释其基本概念,随后结合实战案例,手把手引导读者构建一个完整的DDD架构体系。

下一篇,我将深入探讨DDD领域层的丰富内涵,剖析其中涉及到的关键概念,为您的DDD学习之旅铺设坚实的基石。

有疑问可关注留言,我会及时回复

原文链接: https://juejin.cn/post/7370708996419207222

文章收集整理于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除,如若转载,请注明出处:http://www.cxyroad.com/17222.html

QR code