5分钟迅速掌握领域驱动设计的40个关键概念

简介: 本文对《领域驱动设计-软件复杂性应对之道》一书进行高度凝练,梳理了领域驱动设计的架构图、基本要素和重要概念。从细节入手,以小见大,你想知道的定义,这里都有。

image.png

一、构造块

构造块是指领域设计中最基本的一些元素。

image.png


1.1 分层架构

分层是常用的方法,不仅是领域驱动设计,计算机网络也会看到分层思想:网络的七层模型。分层的好处在于:可以集中精力关注每一层的功能职责,更好地分工协作。


分层的基本原则是:层中的任何元素都仅依赖于本层的其他元素或其下层的元素。下层如果不得已要调用上层的话,需要采用合适的模式,如观察者模式或者回调机制等。


常见分层如下:


  1. 用户界面层(或表示层):展示信息等。如:web 服务的 Contoller。
  2. 应用层:协调领域对象。如:支撑 Contoller 的 Service 服务。
  3. 领域层(或模型层):表达业务概念、业务状态信息、业务规则。
  4. 基础设施层:为上面各层提供通用的技术能力。如:数据库操作等。


1.2 关联

模型其实是真实世界模型的一个子集,不需要每个细节都反映出来,关联关系也是如此。


关联描述的是对象之间的联系,作者描述了3种减少关系复杂度的方法:


  1. 规定一个方向遍历:如,学校和校长是多对多的双向关系,但是如果可以考虑一个校长只在一个学校担任的职务的话,可以简化为学校到校长的1对多的关系。


  1. 添加一个限定符,以便有效地减少多重关联:如,在学校的某个特定时期,只有一位正校长。


  1. 消除不必要的关联:按需描述即可,less is more。 image.png

1.3 entity

实体 entity 的定义:主要由标识定义的对象被称做entity,特点是在整个生命中具有连续性。

简单理解为领域层中带有意义ID的对象,如:订单信息(含订单ID)。


1.4 value object

值对象 value object 的定义:用于描述领域的某个方面而本身没有概念标识的对象称为 value object。


简单理解为对象属性决定差异的个体,如:颜色RGB对象,只要rgb值一致,那么其实是一种颜色,并不关心对象的本身到底是哪个实例。


这类对象特点:

  • 经常作为参数在对象之间传递消息,常常是临时对象。
  • 设计选择:复制、共享或保持value object不变。
  • 为性能优化提供了更多选择:可缓存、可共享等。

1.5 service

领域层中服务 service 的特征:


  • 与领域概念相关的操作不是 entity 或 value object 的一个自然组成部分。
  • 接口是根据领域模型的其他元素定义的。
  • 操作是无状态的。


简单理解为领域层中一些需要协调多个对象的无状态函数。可以暴露领域中的一些功能。


值得注意的是:


  • service不只在领域层使用,根据职责,service也会分到各层中。
  • 可以控制领域层中接口的粒度。

1.6 aggregate

聚合 aggregate 是一组相关对象的组合,有一个根(root)和一个边界(boundary)。外部对象只能引用根,而边界之间的内部对象之间则可以相互引用。

image.png


1.7 factory

工厂 factory 负责复杂对象和aggreate的创建,是领域设计的一部分。


1.8 repository

存储库 repository 为那些需要直接访问的对象提供数据访问能力,封装底层存储逻辑。


1.9 specifiction

声明 specifiction 是为特殊目的创建了谓词形式的 VALUE OBJECT,是一个谓词,可以用来确定对象是否满足某些标准。


场景:某些业务规则不适合作为Entity 或 VALUE OBJECT 的职责。


二、柔性设计

柔性设计(supple design)运用深层模型所蕴含的潜力来开发出清晰、灵活且健壮的实现,并得到预期的效果。

image.png


2.1 intention-revealing interfaces

释意接口 intention-revealing interfaces:在命名类和操作时要描述它们的效果和目的。


2.2 side-effect-free function

无副作用函数 side-effect-free function:尽可能把程序的逻辑放到函数中,函数不产生明显的副作用,把命令(引起明显状态改变的方法)隔离出来。


2.3 assertion

断言 assertion:对程序某个时刻正确状态的声明,在编程中编写 assertion 或者单元测试。


2.4 conceptual contour

概念轮廓 conceptual contour:领域本身的一致性,把设计元素分解为内聚的单元。


2.5 standalone class

孤立的类 standalone class:无需引用任何其他对象(系统的基本类和基础库除外)就能够理解和测试的类。把无关对象提取到对象之外,保持低耦合。


2.6 closure of operation

闭合操作 closure of operation:闭合操作提供了一个高层接口,同时又不会引入对其他概念的任何依赖。在适当的情况下,可以定义操作的返回类型与参数类型相同。


三、战略设计

战略设计(strategic design):一种针对系统整体的建设和设计决策。

image.png


3.1 bounded context

限界上下文 bounded context:特定模型的界限应用。限界上下文使团队知道什么必须保持一致,什么必须独立开发。


3.2 continuous integration

持续集成 continuous integration:把工作足够频繁地合并到一起,并使它们保持一致。


3.3 context map

上下文图 context map :项目所涉及的界限上下文以及它们与模型之间的关系的一种表示。描述模型之间的联系点,明确所有通信需要的转换,并突出任何共享的内容。

image.png


3.4 shared kernel

共享内核 shared kernel :通常是共享核心领域或者是一组通用子领域。

image.png


3.5 customer/supplier

客户/供应商关系 customer/supplier:上下游关系。不同客户需要协商来平衡,上游团队需要有自动测试套件。

image.png



3.6 conformist

跟随者模式 conformist:单方面跟随模式。上游的设计质量较好,容易兼容,可以采用严格遵循上游团队的模型。

image.png

3.7 anticorruption layer

防腐层 anticorruption layer:防腐层、隔离层,使用 facade or adapter 等模式。可以减少其它系统变动对本系统的影响。

image.png


3.8 separate way

各行其道 separate way:声明一个与其它上下文毫无关联的 bounded context,使开发人员能够在这个小范围内找到简单、专用的解决方案。

image.png

3.9 open host service

开放主机服务 open host service:开放子系统供其他系统访问。

image.png


3.10 published language

共享语言 published language:把一个良好文档化、能够表达领域信息的共享语言作为公共的通信媒介,必要时在其它信息与该语言之间进行转换。


四、精炼

精炼(distillation):是把一堆混杂在一起的组件分开的过程,从中提取出最重要的内容,使得它更有价值。

image.png



4.1 core domain

核心领域 core domain:模型中最关键的部分,是程序的标志性部分,也是应用程序的核心诉求。


4.2 generic subdomain

通用子领域 generic subdomain:识别出对项目意图无关的内聚子领域,提取通用模型,并分离出来。


4.3 domain vision statement

领域愿景说明 domain vision statement:类似愿景说明文档,关注领域模型的本质,以及如何为企业带来价值。


4.4 highlight core

突出核心 highlight core:编写简洁文档描述 core domain 以及核心元素之间的主要交互过程,并把 core domain 标记出来。

 

4.5 cohesive mechanism

内聚机制 cohesive mechanism:把内聚的部分分离到一个单独的轻量级框架汇中, 并用释意接口暴露框架功能,从而使得领域元素关注“做什么”,“怎么做”转移给了框架。


4.6 segregated core

分离的核心 segregated core:把核心概念从支持性元素中分离出来,并增强核心的内聚性。把通用元素、支持性元素提取到其它对象中。


4.7 abstract core

抽象核心 abstract core:识别模型中最基本的概念(能表达出主要组件的大部分交互),并分离到抽象模型中(类、抽象类或接口)。抽象模型放在自己的模块中,实现类留在子领域定义的模块中。可以减少模块间依赖的复杂性。

image.png

五、大型结构

大型结构(large-scale structure):一组高层的概念、规则,它为整个系统建立了一种设计模式,能够从更大的角度来讨论和理解系统。

image.png


5.1 evolving order

演变有序 evolving order:让概念上的大型结构随着应用程序一起演变,甚至可以变成一种完全不同的结构风格。

image.png


5.2 system metaphor

系统隐喻 system metaphor:当系统的一个具体类比正好符合团队成员对系统的想象,并且能够引导他们向着一个有用的方向进行思考时,就应该把这个类比用作一种大型结构。例如:用真实大楼的防火墙来类比网络的防火墙。

image.png


5.3 responsibility layer

职责分层 responsibility layer:在具有自然层次的模型中,可以围绕主要职责进行概念上的分层,这样可以结合使用”分层“和”职责驱动的设计“这两个有力的原则。

image.png


5.4 knowledge level

知识级别 knowledge level:是一组描述了另一组对象应该有哪些行为的对象。当我们需要让用户对模型的一部分有所控制,而模型又必须满足更大的一组规则情况时,可以利用这个模式来处理。可以通过类型的知识,去选择不同的策略。

image.png


5.5 pluggable component framework

可插入式组件框架 pluggable component framework:从接口和交互中提炼出一个抽象核心 abstract core,并创建一个框架,这个框架要允许这些接口的各种不同实现被自由替换。




来源  |  阿里云开发者公众号

作者  |  闵大为


相关文章
|
Python
使用 Pandas 库时,如何处理数据的重复值?
在使用Pandas处理数据重复值时,需要根据具体的数据特点和分析需求,选择合适的方法来确保数据的准确性和唯一性。
849 64
|
11月前
|
存储 缓存 监控
分布式架构知识体系
本文力求从分布式基础理论,架构设计模式,工程应用,部署运维,业界方案这几大方面,介绍基于MSA(微服务架构)的分布式的知识体系大纲。
553 13
|
11月前
|
存储 设计模式 监控
快速定位并优化CPU 与 JVM 内存性能瓶颈
本文介绍了 Java 应用常见的 CPU & JVM 内存热点原因及优化思路。
1044 166
|
缓存 应用服务中间件 网络安全
Nginx中配置HTTP2协议的方法
Nginx中配置HTTP2协议的方法
896 7
|
11月前
|
人工智能 运维 监控
别再熬夜调模型——从构想到落地,我们都管了!
本文将以 Qwen2.5 : 7B 为例进行演示,介绍如何通过人工智能平台 PAI实现AI 研发的全链路支持,覆盖了从数据标注、模型开发、训练、评估、部署和运维管控的整个AI研发生命周期。
1289 37
|
11月前
|
存储 缓存 监控
71.7万/秒到1.4万/秒!数据库查询优化实战
在现代计算机系统中,程序的局部性原理是优化性能的关键。通过利用时间局部性和空间局部性,可以显著提升数据访问效率,减少高开销的操作如内存访问和网络 I/O。本文将探讨如何利用空间局部性原理,在实际案例中减少数据库查询量,并通过详细的监控和优化措施确保系统的稳定性和高效性。
71.7万/秒到1.4万/秒!数据库查询优化实战
|
NoSQL 编译器 程序员
【C语言】揭秘GCC:从平凡到卓越的编译艺术,一场代码与效率的激情碰撞,探索那些不为人知的秘密武器,让你的程序瞬间提速百倍!
【8月更文挑战第20天】GCC,GNU Compiler Collection,是GNU项目中的开源编译器集合,支持C、C++等多种语言。作为C语言程序员的重要工具,GCC具备跨平台性、高度可配置性及丰富的优化选项等特点。通过简单示例,如编译“Hello, GCC!”程序 (`gcc -o hello hello.c`),展示了GCC的基础用法及不同优化级别(`-O0`, `-O1`, `-O3`)对性能的影响。GCC还支持生成调试信息(`-g`),便于使用GDB等工具进行调试。尽管有如Microsoft Visual C++、Clang等竞品,GCC仍因其灵活性和强大的功能被广泛采用。
379 1
|
11月前
|
缓存 IDE Java
JVM核心知识体系
本文从JVM的最小元素类的结构出发,介绍类加载器的工作原理和应用场景,思考类加载器存在的意义。进而描述JVM逻辑内存的分布和管理方式,同时列举常用的JVM调优工具和使用方法,最后介绍高级特性JDPA框架和字节码增强技术,实现热替换。
|
11月前
|
存储 关系型数据库 MySQL
浅入浅出——MySQL索引
本文介绍了数据库索引的概念和各种索引结构,如哈希表、B+树、InnoDB引擎的索引运作原理等。还分享了覆盖索引、联合索引、最左前缀原则等优化技巧,以及如何避免索引误用,提高数据库性能。
197 11
|
11月前
|
搜索推荐 架构师 数据挖掘
架构实操:画好一张业务模型图
本文以SDK设计的角度分析了如何构建一张属于SDK的各个业务的模型图。
699 14