如何有效识别限界上下文?

在实施DDD的过程中,识别限界上下文是一大难点,但也并非无章可循。在本文内容中,我们将分别从业务维度、工作维度以及技术维度进行展开,讨论如何有效识别限界上下文的方法和技巧。

从业务维度识别限界上下文

从业务维度识别限界上下文的基本思路很明确,就是围绕业务流程的组成结构进行切入。

  1. 业务维度的表现形式

业务维度常见的有两种表现形式,即:

  1. 流程+角色+活动
  2. 角色+行为

我们先来看第一种业务维度的表现形式,如果用图例来展示这种业务维度,可以得到类似下图所示的效果。

在上图中,我们看到业务维度的组成包括流程、角色以及活动三个组成部分,构成了流程+角色+活动的表现形式。随着业务流程的演进,我们可以划分不同的边界并提取不同的限界上下文。而在每个上下文中,我们可以进一步提取多个活动。从这种表现形式看,原本基于某个角色的完整业务流程就被认为切割成多个片段。因此,限界上下文可以被认为是动态的业务流程被边界静态切分的产物。

业务维度的另一种常见表现形式是角色+行为,我们可以使用UML中的用例图来展示这种业务维度,如下图所示。


在上图中,我们看到在A限界上下文中存在多个用例,其中用例4又与另一个B限界上下文发生关联关系。用例描述了业务场景和功能,可以用来提取限界上下文。

  1. 业务相关性

当我们通过业务维度识别出若干限界上下文之后,下一步工作是对这些限界上下文进行分析,并判断是否需要考虑对已识别上下文进行优化。这时候就需要引入业务相关性这个概念,因为业务相关性较高的业务逻辑往往应该被合并到同一个限界上下文中。

一般认为,业务相关性有两种类型,即语义相关性和功能相关性。所谓语义相关性,指的是根据名称就能体现业务的相关性,例如浏览商品、发布商品、推荐商品都属于“商品”类的业务。而功能相关性需要根据业务目标来确定,例如推荐商品、活动促销、积分折扣都是为了做“营销”。在基于业务维度识别限界上下文的过程中,你可以根据语义相关性和功能相关性来对上下文进行重新审视。

从工作维度识别限界上下文

从工作维度识别限界上下文跟团队工作相关,是一类依托于管理理念的上下文识别方法。DDD实施过程所崇尚的团队是特征团队。这里引出了一个概念,即特征团队(Feature Team)。我们知道团队的组建方式可以是职能团队也可以是特征团队,前者关注于某一个特定职能,如常见的服务端、前端、数据库、UI等功能团队,而后者则代表一种跨职能(Cross Function)的团队构建方式,团队中包括服务端、前端等各种角色。在DDD工作坊的实施方法中,特征团队的范围更为广泛,可以包含与这个产品和项目相关的所有成员。正常情况下,一个特征团队可以同时应对多个限界上下文的开发需求。因此,判断上下文识别是否合理的标准就是:

一个特征团队是否能够同时开发若干个限界上下文?

从工作维度讲,如果一个特征团队无法同时开发若干个限界上下文,就说明这些限界上下文之间存在较强的依赖关系,边界的拆分不合理,需要进一步识别限界上下文。

从技术维度识别限界上下文

从技术维度识别限界上下文是最符合技术人员的思维方式,我们通过一个示例就可以让你掌握这种识别方法。例如,在电商系统中,我们基于业务维度或工作维度已经成功提取了若干个限界上下文,如下图所示。


现在,我们明确系统需要考虑质量需求,即系统需要应对高并发场景下的商品查询需求。这时候,从技术维度出发,我们就可以专门提取一个实现多元化搜索功能的限界上下文,如下图所示。


接着,我们进一步明确系统需要考虑架构需求,即为了实现技术复用,系统需要在商品、支付、搜索等功能中根据用户画像实现千人千面的商品推荐。显然,从技术维度出发,我们也可以专门提取一个实现推荐功能的限界上下文,如下图所示。


正如前面示例所展示的,基于技术维度的识别方法往往作用于业务维度和工作维度之后,这也符合正常的系统建模顺序,先提炼业务需求再梳理技术需求。

让我们对识别限界上下文的三种方法进行总结,下图可以帮助你更好的理解它们之间的实施方法和特性。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/599191.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

羊大师解析,鲜为人知的羊奶冷知识

羊大师解析,鲜为人知的羊奶冷知识 羊奶的脂肪球更小:相较于牛奶,羊奶中的脂肪球直径更小,这有助于其更快地被人体消化和吸收。 羊奶含有更多的中链脂肪酸:羊奶中含有较多的中链脂肪酸(MCT)&am…

安装nginx-1.25.5与ngx_http_headers_more_filter_module模块

#下载nginx的代码 curl -O http://nginx.org/download/nginx-1.25.5.tar.gz #下载headers-more-nginx-module代码 git clone https://github.com/openresty/headers-more-nginx-module#解压 tar -xzf nginx-1.25.5.tar.gzcd nginx-1.25.5#--add-dynamic-module 下载下来的目录 …

Al Agent:开启智能化未来的关键角色,让机器更智能的为我们服务

文章目录 🚀Al Agent是什么📕Al Agent的工作原理与技术💪Al Agent应用领域🚀智能家居应用🌈医疗健康领域⭐金融服务行业🌂交通运输管理🎬教育培训应用 🔒Al Agent优势与挑战✊Al Age…

移动端自适应

基本实现核心思想 基本原则上是,布局更多地使用flex,然后尺寸使用rem,vw,vh为单位如果是根据不同的屏幕需要有不同的布局了,一般通过检测屏幕尺寸换不同的站点或者媒体查询使用css rem 以html字体太小为1rem的大小&…

LM4562NA 直插DIP8双运放 音频hifi运算放大器

LM4562NA是一款高性能音频运算放大器,其应用领域主要集中在音频和声音处理方面,包括但不限于: 1. 专业录音设备:在录音棚、广播电台和电视台等专业环境中,用于信号放大和处理,确保高质量的声音录制和传输…

揭秘数据可视化:五款利器助力决策

在当今这个数据驱动的时代,数据可视化已成为企业决策、数据分析不可或缺的一部分。通过直观、生动的图形、图像,数据可视化能够更快速、更准确地传达信息,帮助企业洞察数据背后的价值。本文将为您介绍几款优秀的数据可视化工具。 一、山海鲸…

docker-compose编排集成工具,consul服务更新与发现

一、引言 我们知道使用一个 Dockerfile 模板文件可以定义一个单独的应用容器,如果需要定义多个容器就需要服务编排。服务编排有很多种技术方案,今天给大家介绍 Docker 官方产品 Docker-Compose Dockerfile 可以定义一个单独的应用容器&#xff1…

图片编辑工具-Gimp

一、前言 GIMP(GNU Image Manipulation Program)是一款免费开源的图像编辑软件,具有功能强大和跨平台的特性。 GIMP作为一个图像编辑器,它提供了广泛的图像处理功能,包括但不限于照片修饰、图像合成以及创建艺术作品…

uni-app安卓本地打包个推图标配置

如果什么都不配置,默认的就是个推小鲸鱼图标 默认效果 配置成功效果 个推图标配置 新建目录 drawable-hdpi、drawable-ldpi、drawable-mdpi、drawable-xhdpi、drawable-xxhdpi、drawable-xxxhdpi 目录中存放图标 每个目录中存放对应大小的图标,大图…

Day28:ElasticSearch入门、Spring整合ES、开发社区搜索功能

ElasticSearch入门 Elasticsearch简介 一个分布式的、Restful风格的搜索引擎。支持对各种类型的数据的检索(非结构化的也可以)。搜索速度快,可以提供实时的搜索服务。便于水平扩展(集群式部署),每秒可以处…

分享三维地理模型制作实践

前言 地理信息系统(GIS)是一种用于捕获、存储、检查和显示与地球表面位置相关的数据的计算机系统。GIS可以在一张地图上显示许多不同类型的数据,如街道、建筑物和植被。这使人们能够更容易地看到、分析和理解模式和关系。 实践 从地理空间…

正在载入qrc文件 指定的qrc文件无法找到。您想更新这个文件的位置么?

打开Qt的ui文件&#xff0c;弹出提示框 如果需要用到qrc文件&#xff0c;选择Yes&#xff0c;再选择qrc文件所在的位置&#xff1b;如果不需要qrc文件&#xff0c;可以选择No&#xff0c;然后用普通文本编辑器打开&#xff0c;将“ <resources> <include location&q…

经典面试题---环形链表

1. 环形链表1. - 力扣&#xff08;LeetCode&#xff09; 要解决这道题&#xff0c;我们首先要挖掘出带环的链表与不带环的链表之间的差别。 以此&#xff0c;才能设计出算法来体现这种差别并判断。 二者最突出的不同&#xff0c;就是不带环的链表有尾结点&#xff0c;也就是说…

Golang | Leetcode Golang题解之第71题简化路径

题目&#xff1a; 题解&#xff1a; func simplifyPath(path string) string {stack : []string{}for _, name : range strings.Split(path, "/") {if name ".." {if len(stack) > 0 {stack stack[:len(stack)-1]}} else if name ! "" &am…

Android 系统启动流程源码分析

一、Init进程启动 是一个由内核启动的用户级进程。内核自行启动之后&#xff0c;就通过启动一个用户级程序init的方式&#xff0c;完成引导进程。 启动的代码init.c中的main函数执行过程&#xff1a;system\core\init.c中&#xff1a; 主要下面两个重要的过程&#xff1a; 1…

泰克示波器如何存储CSV文件?

泰克示波器可以用于各种信号的测量和分析。在实际测试中&#xff0c;我们经常需要将示波器采集到的波形数据保存下来&#xff0c;以便后续的处理和分析。泰克示波器提供了多种方法来存储波形数据&#xff0c;其中一种常用的方式是将数据保存为CSV文件。下面将介绍泰克示波器如何…

VINS预积分与误差模型

文章目录 IMU的测量值误差模型IMU预积分真实模型IMU预积分估计模型误差模型普通增量积分中值积分法 参考文献 IMU的测量值误差模型 IMU的测量值误差模型&#xff1a; a ^ t a t R w t g w b a t n a t ω ^ t ω t b ω t n ω t \begin{array}{} {{{\hat a}_t} {a_t…

成功案例(IF=7.3)| 转录组+蛋白质组+代谢组联合分析分析揭示胰腺癌中TAM2相关的糖酵解和丙酮酸代谢重构

研究背景 肿瘤的进展和发展需要癌细胞的代谢重编程&#xff0c;癌细胞能量代谢模式的改变可以满足快速增殖和适应肿瘤微环境的需要。肿瘤微环境&#xff08;TME&#xff09;中的代谢状态受到多种因素的影响&#xff0c;包括血管生成、与其他细胞的相互作用和系统代谢。代谢异质…

Python中批量提取[]括号内第一个元素的四种方法

目录 一、引言 二、方法介绍 使用正则表达式&#xff08;Regular Expression&#xff09; 使用字符串分割&#xff08;String Split&#xff09; 使用ast模块解析字符串为列表 使用JSON模块解析字符串 三、方法比较与选择 四、总结 一、引言 在Python数据处理过程中&a…

探索1688、淘宝、京东搜索商品聚合API接口:一站式电商搜索解决方案

随着电商行业的不断发展&#xff0c;电商平台的数量和商品种类都在快速增长。商家和开发者在运营过程中&#xff0c;需要经常进行跨平台的商品搜索和数据分析。然而&#xff0c;由于各个电商平台的数据接口存在差异&#xff0c;直接对接多个平台不仅效率低下&#xff0c;而且维…