美文网首页
一分钟搞懂DDD

一分钟搞懂DDD

作者: DeepNoMind | 来源:发表于2021-11-14 15:47 被阅读0次

领域驱动设计的提出已经有将近20年的历史,在最近几年微服务兴起之后,人们发现领域驱动设计天然适配微服务架构,因此吸引了大量的关注。这篇文章以非常简洁的笔触介绍了DDD涉及到的一些概念定义,可以快速的建立起领域设计的基本概念。原文:DDD in a nutshell[1]

你可能已经听很多人谈论过DDD,DDD是领域驱动设计(Domain-Driven Design)的简称,有人把它想象成一种巨大而神奇的东西,但实际上它只是一组包含了许多组合模式和最佳实践的方法,帮助我们构建更好的软件。

领域驱动设计是指软件代码的结构和语言应该与业务领域相匹配的概念。例如,如果一个软件处理贷款申请,它可能有像LoanApplication和Customer这样的类,以及像AcceptOffer和Withdraw这样的方法。——维基百科[2]

有许多著名的书籍是关于领域驱动设计的,比如Eric Evans在2003年出版的《领域驱动设计——软件核心复杂性应对之道》[3]。但在本文中,我希望能以简单的方式帮助你理解DDD的全貌,后续你可以通过阅读相关书籍了解更多详细信息。

总体来说,关于DDD的讨论主要是关于战略和战术模式:

  • 战略模式帮助你设计领域和子领域,利用通用语言进行交流,根据输出的结果支持团队的组织架构。
  • 战术模式指导你如何以可伸缩的方式实现应用程序。
DDD简介

战略设计(Strategic Design)

战略模式可以帮助你设计领域和子领域,这些领域通过通用语言进行交流,支持你根据结果组织/构建你的团队。

首先,需要定义通用语言,这将帮助团队就相同的术语达成一致,从而带来对定义或业务的相同理解。我想强调的是,这是必要步骤,应该在一开始就做,并在开发期间继续下去。

有界上下文帮助你定义主领域和子领域以及它们之间(上游和下游)的依赖关系。然后在此基础上,可以根据组件或服务来构造应用程序。最后,将团队组织起来,负责构建和维护这些服务。

战术设计(Tactical Design)

战术模式指导你如何以可伸缩的方式实现应用程序。

战术设计帮助基于构建块创建优雅的领域模型,参见下面的主要构建块:

聚合(Aggregates)

聚合是战术设计中最重要、最复杂的模式之一,聚合基于另外两种战术标准(Tactical Standards),即实体(Entities)值对象(Value Objects)聚合是一个或多个实体的集群,也可能包含值对象,集群的父实体被称为聚合根(Aggregate Root)。(thedomaindrivendesign.io)

例如,在电子商务领域,你也许会定义一个命名为Order的聚合,包含Address(值对象)和Consumer(实体)。

实体(Entities)

实体是具有惟一标识符的潜在可变对象,在其域模型中有自己的生命周期,从而我们能够获得该实体完整状态转换历史。

值对象(Value Objects)

值对象实体的区别在于值对象是不可变的,并且没有唯一的标识,仅由其属性的值所定义。这种不变性造成的结果是,为了更新值对象,必须创建新实例来替换旧实例。

服务(Services)

服务是执行某些逻辑的无状态对象,这些逻辑不适合在单一的实体值对象上进行操作。

服务执行特定于域的操作,可能会涉及多个域对象。

仓库(Repositories)

仓库主要用于处理存储,抽象了对数据存储的关注,负责持久化聚合

工程(Factories)

工厂用于在对象的构造中提供抽象,并返回聚合根实体值对象工厂可以替代构造函数构建复杂的对象。

事件(Events)

事件表明领域中已经发生的重大事件,需要向属于该领域的其他利益相关者报告。通常聚合会负责发布事件。

组件(Modules)

开发人员很少提及组件,但是,使用组件可能会非常有趣。

组件帮助我们分离概念,可以根据不同的编程语言将其定义为包(package)命名空间(namespace),并且始终遵循通用语言(Ubiquitous Language)

结合以上构建块,战术设计还提供了许多有价值的模式,如CQRS、事件源(Event Sourcing)、分层架构(Layered Architecture)……,这些模式可以帮助我们构建易于维护和扩展的更好的系统。

References:
[1] https://tech.tamara.co/ddd-in-a-nutshell-3852b0a6155a
[2] https://en.wikipedia.org/wiki/Domain-driven_design
[3] https://book.douban.com/subject/5344973/

你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。
微信公众号:DeepNoMind

相关文章

  • 一分钟搞懂DDD

    领域驱动设计的提出已经有将近20年的历史,在最近几年微服务兴起之后,人们发现领域驱动设计天然适配微服务架构,因此吸...

  • MarkDown

    ###fff ..aa..... ddd ddd ddd ddd ddddddasdf

  • test1

    *title* dddd ddd ddd ddd

  • 第一节 DDD相关概念

    什么是DDD DDD相关概念 1.1什么是DDD 领域驱动设计,即Domain Driven Design(DDD...

  • 2018-02-09

    # aaa ## aaa ### ddd ddd

  • XML之XPath

    /AAA/AAA/CCC/AAA/DDD/BBB //BBB//DDD/BBB /AAA/CCC/DDD/*/*/...

  • DDD领域驱动设计浅见

    目录 DDD简介DDD是啥DDD能给微服务带来什么不用DDD的常见设计方式DDD整洁架构常见三层架构设计整洁架构D...

  • 无标题文章

    DDD## WAD-- 2.2323 ddgoogle ddd ddd fff 11 22 22 33 *简书ht...

  • 无12222标题文章

    d ddd ddd www.baidu.com baidu

  • DDD分层架构的三种模式

    引言 在讨论DDD分层架构的模式之前,我们先一起回顾一下DDD和分层架构的相关知识。 DDD DDD(Domain...

网友评论

      本文标题:一分钟搞懂DDD

      本文链接:https://www.haomeiwen.com/subject/dlqxtrtx.html