• 我们对DDD(领域驱动设计)的几种常见问题
  • 发布于 2个月前
  • 196 热度
    0 评论
  • 风尘客
  • 0 粉丝 32 篇博客
  •   
DDD是这几年随着微服务再次火起来的概念,可以说是在行业内,人人必谈DDD。当然,在火热背后,也会存在大量的误解,譬如,有很多人将DDD教条化和信仰化。今天我们聊一聊,关于对DDD的哪些常见的误解吧。

Part1 什么是DDD
Domain-Driven Design(领域驱动设计,简称DDD)是一种软件开发方法,它强调以业务领域为中心,通过建立领域模型和使用通用语言来实现业务需求和技术实现的高度匹配。DDD的核心思想是,软件应该反映业务的本质,而不是表面的细节。DDD强调将软件系统的设计和实现与业务领域紧密结合。

它提供了一些概念和技术,如聚合根、实体、值对象、领域事件、限界上下文等,以帮助开发人员更好地组织和表达领域知识。其中最重要的方法之一是领域建模。领域建模是指使用一种形式化或半形式化的语言来描述领域的结构和行为。这种语言通常称为领域模型。

为了创建一个有效的领域模型,DDD 强调了以下几个方面:

通用语言:通用语言是指在项目中使用的一套共享的、统一的、准确的领域术语。通用语言应该在所有的沟通场景中使用,包括开发者之间、开发者和用户之间、代码和文档之间等。通用语言有助于消除歧义和误解,提高沟通效率和质量,保证领域模型的一致性和可靠性。


限界上下文:限界上下文是指一个具有明确边界和内聚性的子领域。限界上下文可以根据不同的业务目标、功能划分、团队组织等因素来划分。限界上下文内部应该有一个完整且自洽的领域模型,而与其他限界上下文之间应该有清晰且稳定的交互接口。限界上下文有助于降低复杂度,提高可扩展性和可维护性,促进团队协作和自治。


实体、值对象和聚合:实体、值对象和聚合是三种常见的领域模型元素。实体是指具有唯一标识和生命周期的领域对象,比如用户、订单、商品等。值对象是指没有唯一标识,只关注属性和行为的领域对象,比如日期、金额、地址等。聚合是指一组相关的实体和值对象的集合,以及一个代表该集合的根实体,比如订单聚合包含了订单实体和订单项值对象,以及一个订单根实体。实体、值对象和聚合有助于封装领域对象的状态和行为,保证数据的完整性和一致性,简化领域模型的设计和实现。


除了领域建模之外,DDD 还提供了其他一些方法和模式,比如领域事件、领域服务、仓储、工厂、策略、规约等。这些方法和模式都是为了解决领域中的一些特定的问题或需求,比如如何表示领域中发生的变化,如何提供跨聚合或跨限界上下文的功能,如何持久化和获取领域对象,如何创建和初始化领域对象,如何封装和复用业务逻辑等。

领域模型的目的是捕捉和抽象出领域中最重要和最核心的概念和关系,以及它们之间的协作和交互。DDD鼓励团队成员之间的沟通和协作,以共同理解业务需求,并将这些需求转化为软件设计的实现。

总之,DDD是一种强调将业务领域知识融入软件设计和开发过程的方法论。DDD不仅仅是一种技术或工具,而是一种思维方式和一组原则,旨在帮助开发团队构建高质量、可维护和可扩展的软件系统。

Part2 DDD不是规范和术语表
首先,很多人误解了DDD的含义,认为它是一种规范化的、通用的词汇表,可以用来描述任何业务领域。他们试图用一套固定的术语,来定义所有的概念和实体,忽略了不同领域之间的差异和语境。这样做的结果是,领域模型变得僵化、复杂、难以维护,甚至与业务现实脱节。事实上,DDD并不是一种规范化的、通用的词汇表。它是一种设计原则和实践,旨在帮助开发者理解和表达业务领域的复杂性和多样性。

DDD认为,每个领域都有自己的语言和逻辑,这些语言和逻辑应该被尊重和保留,而不是被强行统一。因此,DDD提倡使用通用语言(Ubiquitous Language),即在特定领域内使用一致、准确、无歧义的语言来沟通和设计。通用语言不是一种抽象的、泛化的语言,而是一种具体的、特化的语言,它反映了领域内的知识和规则。

此外,DDD还提出了限界上下文(Bounded Context)的概念,即将一个大型的、复杂的领域划分为多个相对独立的、有明确边界的子领域。每个限界上下文都有自己的通用语言和领域模型,它们可以根据自身的需要进行变化和演进,而不受其他限界上下文的影响。当不同限界上下文之间需要交互时,可以通过显式的映射或转换来实现语言和模型的互操作。

综合可见,DDD并不是一种僵硬的规范和术语表。而是一种灵活的、适应性强的设计方法,它能够应对业务领域的变化和多样性。

Part3 DDD不是强制性的
很多人可能会误解,认为 DDD 是要求所有参与者都使用同一种语言(如英语、中文等)来表达领域模型,或者是要求所有的代码、文档、界面等都使用同一种语言来命名和展示。事实上,DDD 并不强制使用任何特定的语言,而是强调使用一致的术语和概念。这些术语和概念可以用不同的语言来表达,只要它们在不同的语境中能够对应起来,并且能够准确地反映领域的本质和规则。

在DDD中,共享语言是指团队成员之间建立起来的一种用于描述和讨论业务领域的术语和概念的通用语言。这个共享语言是通过与领域专家密切合作、理解业务需求和领域知识的过程中逐步建立起来的。DDD强调开发团队与领域专家之间的沟通和合作,通过共同探索业务领域的语言和概念来建立共享语言。这样可以确保开发团队对业务需求的理解准确,并能够将业务需求转化为软件设计的实现。

由于每个领域都有其独特性和特定的语言,DDD鼓励团队在与领域专家合作的过程中根据具体的领域来定义和使用术语。这种灵活性和合作性使得团队能够根据业务需求和上下文特点选择适当的术语和概念,而不是被迫采用一种统一的、强制性的语言。

例如,在一个电商领域中,可能有一个通用语言中的术语叫做 Order(订单)。这个术语可以用英语、中文或其他任何语言来表达,只要它能够清楚地表示一个客户向商家购买商品的行为,并且包含了相关的属性和操作。

在不同的层次和团队中,可以根据需要使用不同的语言来实现 Order 这个概念,比如在数据库中用 SQL 语句来存储和查询订单数据,在后端代码中用 Java 或 C# 等编程语言来定义和处理订单对象,在前端界面中用 HTML 或 CSS 等标记语言来展示和交互订单信息。

这些不同的语言并不影响通用语言的一致性,只要它们能够遵循领域模型的定义和约束,并且能够在不同的环境中互相转换和对应。

因此,DDD强调的是建立共享语言的过程和团队之间的合作,而不是强制性地规定团队必须使用某种特定的术语或语言。这种灵活性和合作性使得DDD适应不同领域和项目的需求,并促进了开发团队和业务专家之间的有效沟通和理解。

Part4 DDD不是一刀切的方法
有不少人对DDD有一个误解,认为DDD就是解决一切问题的必选项。事实上,DDD并不是一种适用于所有场景的通用方法。它有自己的优势和局限性,需要根据具体的业务需求和技术环境来选择和应用。

以下是一些需要考虑的因素:
业务复杂度:DDD适合处理复杂的业务逻辑,需要深入分析和抽象的领域。如果业务比较简单,只涉及到基本的增删改查操作,那么使用DDD可能会带来过度设计和不必要的开发成本。
业务变化:DDD适合应对频繁变化的业务需求,能够保持领域模型和代码的一致性和可扩展性。如果业务比较稳定,不需要经常调整和优化,那么使用DDD可能会增加维护的难度和风险。
团队规模:DDD适合由多个小型团队协作开发的项目,能够实现高内聚低耦合的模块划分和通信。如果团队规模比较大,或者有多个不同的利益相关者参与,那么使用DDD可能会导致沟通和协调的问题和冲突。

技术栈:DDD适合使用面向对象编程语言和关系型数据库的项目,能够充分利用对象映射和事务处理等特性。如果技术栈比较新颖或者多样化,例如使用函数式编程语言或者非关系型数据库,那么使用DDD可能会遇到技术上的挑战和限制。


第二,DDD鼓励开发团队根据具体项目的需求和领域的特点进行灵活的自定义和调整。DDD强调团队与领域专家之间的合作和共同理解,以建立共享语言和正确的领域模型。这意味着在不同的项目和领域中,DDD的具体实践方式和重点可能会有所不同。

此外,DDD还提供了一些灵活的设计模式和技术,如聚合根、实体、值对象等,可以根据项目的需求和上下文的特点进行选择和应用。这样可以确保软件系统的设计和实现能够更好地与特定领域的复杂性和业务需求相匹配。

可见,从多个层面上来说,DDD从来不是一刀切的标准方法,需要根据具体情况来灵活选择和运用。

在使用DDD之前,我们应该先评估项目的特点和需求,确定是否适合采用DDD。在使用DDD之中,我们应该遵循DDD的原则和实践,但也不要拘泥于形式和细节。在使用DDD之后,我们应该持续关注业务和技术的变化,及时调整和优化领域模型和代码。

Part5 DDD不是业务独裁
有不少人误以为,用DDD了,就是要让业务一切业务说了算,DDD是一种“业务独裁”的方法。事实上是,DDD不是由业务专家或领域专家独自决定和主导的过程。DDD强调的是开发团队和业务专家之间的紧密合作和协作。在DDD实践中,开发团队和业务专家需要共同参与软件开发过程,并通过有效的沟通和合作来共同理解业务需求和领域知识。

DDD鼓励团队成员与业务专家进行频繁的互动和讨论,以便准确地捕捉业务需求,并将其转化为软件设计的实现。虽然业务专家在DDD中扮演着重要的角色,他们提供了关键的业务领域知识和需求,但DDD并不意味着完全由他们独裁地决定软件的设计和实现。相反,DDD强调的是开发团队和业务专家之间的合作和相互理解。

开发团队在DDD中发挥着重要的作用,他们不仅仅是简单地实现业务专家的要求,还负责将领域知识转化为可执行的软件模型。开发者的角色不是一个跟随者,而是一个深度参与的决策者和实现者。所以,团队成员需要积极参与领域的理解和模型设计过程,并与业务专家密切合作,以确保软件系统能够准确地反映业务需求和复杂性。

因此,DDD被认为不是一种“业务独裁”的方法,而是一种强调开发团队和业务专家之间合作和协作的方法。它鼓励要求开发者与业务领域专家进行紧密的合作和沟通,共同创建和维护一个与业务现实和需求变化相适应的领域模型,同时采用合适的技术手段和架构模式来实现领域模型。

Part6 DDD不是技术性的事物
有不少人误以为,DDD依然只是技术层面具体的实现细节,而忽略了去关注更为重要的业务领域的理解和建模。虽然在DDD中,会涉及到一些技术概念和模式,如聚合根、实体、值对象、限界上下文等,但DDD的核心思想在于将业务领域知识贯穿于软件开发过程中,以确保软件系统与业务需求高度匹配。

可见,一致的业务领域理解,团队共识和高效合作,才是DDD的最核心的本质。DDD的最重要的关注点,是通过与领域专家密切合作,共同理解业务领域的核心概念、业务规则和流程,并将其反映在软件模型中。这种领域模型的设计和实现是与业务需求紧密结合的,而不仅仅是技术实现的问题。

DDD鼓励开发团队与业务专家之间的沟通和合作,以共同理解业务需求并创造出正确的领域模型。这要求开发团队具备良好的领域分析能力和业务理解能力,而不仅仅是技术能力。虽然技术在实现和支持DDD的过程中起着重要的作用,但DDD并不将技术作为其核心关注点。DDD自始至终强调的是团队成员之间的合作、共享语言的建立、领域模型的设计等方面,以确保软件系统与业务领域紧密结合,能够满足业务需求。

DDD不是一种“技术性的事物”,而是一种关注于业务领域的理解、建模和软件设计的方法。它强调团队与业务专家之间的协作和沟通,以确保软件系统真正满足业务需求,并为业务领域提供价值。所以,要想成功地应用领域驱动设计,我们不能只停留在技术层面,而要深入到业务层面,要理解业务的本质和价值,要掌握业务的语言和规则,要发现业务的难点和痛点。只有这样,我们才能真正地从业务需求出发,设计出符合业务逻辑的领域模型,实现出满足业务需求的软件系统。

最后
DDD(领域驱动设计)被称为一种用于协作性地探索、建模和利用软件项目中的领域的工具,是因为它提供了一套方法和原则,帮助团队成员共同理解和应用领域知识。DDD(领域驱动设计)的核心思想是,软件系统应该反映和表达领域的本质,而不是仅仅实现一些技术细节或需求。

DDD作为一种方法和工具,强调团队成员之间的协作和共同理解,通过探索领域、建模领域和利用领域,帮助团队更好地将业务领域的知识转化为软件项目的实现,更有效地开发和维护软件系统,更高地满足用户的需求。
用户评论