软件设计不是CRUD(10):低耦合模块设计理论——业务抽象:从需求中提取业务维度
接上文《软件设计不是CRUD(9):低耦合模块设计理论——设计落地所面临的挑战》
2、什么是业务抽象
业务抽象是一种将需求落地成模块功能的设计思想,是对业务需求和技术设计进行转换、隔离的一种分析方法。经过业务抽象后的业务模块一般具有较高的业务屈服度,能更大程度满足模块设计中的基本原则要求。进行业务抽象设计有以下几个关键工作步骤:
-
提取业务维度:业务抽象的一个工作是在需求中提取到变化的业务维度,以及各个业务维度的工作关系。这些业务维度的提取对模块的设计落地至关重要。这些业务维度可能是相互影响的,也可能是独立存在的,但相互影响的场景占大多数情况。
-
确认模块分层:从各个业务模块中提取的业务维度,也是后续确认各个模块所处分层的重要依据。就像上文描述的那样,模块的业务维度自身变化风险越大的模块应该置于应用系统中的更上层;业务维度自身变化风险越小的模块或者与业务无关的工具类型的模块,应该置于应用系统中的更下层。这样的设计目的是保证模块在必须进行设计调整时,调整成本最小。确认模块分层也是后续进行各模块间模型关联性设计、行为关联设计的前提。
-
抽象模型:业务抽象的另一个工作是基于业务维度和确定的模块分层,来定义最小业务模型——满足业务模块的各种模型结构的最大公约数。或者说业务模型之所以能在这个业务模块中工作,其最小应该具备的业务定义。举例来说,各种订单模型之所以能在订单模块中工作,是因为无论哪种订单模型都具有订单类型、订单编号和订单租户这三个业务信息。再例如,租户模块中工作的各种租户信息,都必须具有唯一的租户编号,否则就不认为是租户模型,就不能在租户模块中工作。
-
抽象行为:业务抽象的最后一个工作,是从需求中提取业务模块的关键行为。这些行为分为两种类型:控制逻辑和业务逻辑。业务逻辑是存在于需求场景的各个业务操作点,和之前从需求中提取出来的业务维度紧密相关。例如验证单据正确性、激活通知、发送消息都是独立的业务操作点;控制逻辑是一条或者多条将业务逻辑在各个业务操作点上串联起来的控制方式。好的业务模块设计中,业务逻辑和控制逻辑都可以进行扩展(注:本专题后续文章将重点讲解如何利用设计模式对抽象的行为进行设计落地)。

从上图可知,基于业务抽象进行功能模块设计时,设计目标是完成模型和行为的抽象。为了完成这个设计目标,首先需要从需求中抽取业务维度。本文先来详细介绍第一个话题:如何寻找需求中的业务维度,并进行实例演示。
3、需求中的业务维度
正如上文所描述的那样,业务维度是在业务边界内的可变要素,当业务维度的要素出现不同的值时,会对业务行为产生不同的影响,甚至会分裂出不同的业务走向。提取的每一个业务维度将在随后的设计中形成被控制逻辑管理的一个个关键业务操作点。在以上对于业务维度的描述定义中,读者需要注意几个关键点:
- 在业务边界内的:
进行订单业务模块的需求分析时,能不能将出库单类型提取成一个业务维度呢?很明显这是不行的,因为订单业务模块和出库单业务模块从经验上来讲就是两个不同的模块(绝大多数实际业务场景也是这样的),在设计时他们就应该具有业务隔离性。好的、稳定的分层设计后,订单模块甚至都可能不再知晓有一个出库模块的存在。
有的读者可能会提出质疑,怎么会不行呢?出库单类型万一和订单类型有关呢?例如普通订单生成普通的出库单,赠品补单性质的订单生成补货出库单。两者怎么会没有关联呢?就算需求确实是这样的,库存的处理业务也是在订单业务之外。以上提出的质疑只能说是如何划分业务边界的问题,而不是边界内如何提取业务维度的问题。订单在创建成功后,完全可以通过事件通知、状态通知的方式,将订单已经创建好的状态告知出库模块,再由出库模块自身决定如何进行后续出库业务的处理。换句话说,就是一种模块间行为的关联方式。
- 可以变化的要素:
提取出来的业务维度,其值一定是可变的,并且完成设计后其值也是可扩展的。例如订单类型原始提供了两个值:销售订单、采购订单,这两种订单类型所代表的业务场景是完全不一样。并且这个订单类型维度还可允许二次开发团队进行值的扩展(当然值的扩展也就意味着业务逻辑的扩展)
3.1、业务维度存在的形式
绝大多数情况下,设计人员从需求中提取出来的业务维度都具有一定的关联性,这和业务维度的本身的特点有关:业务维度是需求中可变化的要素,既然是可变化的要素其变化后必然对周围的事物产生或多或少的影响。这种需求的示例可以列举很多,例如:当指挥员身份为资深船长时,才能指挥5万吨以上舰艇作战;只有订单类型为退货订单时,不需要在订单结束后发送短信,改为发送邮件……
业务维度在业务性需求中一定存在且至少有一个,否则业务功能落地后将是一潭死水
相关文章:
软件设计不是CRUD(10):低耦合模块设计理论——业务抽象:从需求中提取业务维度
接上文《软件设计不是CRUD(9):低耦合模块设计理论——设计落地所面临的挑战》 2、什么是业务抽象 业务抽象是一种将需求落地成模块功能的设计思想,是对业务需求和技术设计进行转换、隔离的一种分析方法。经过业务抽象后的业务模块一般具有较高的业务屈服度,能更大程度满…...
S1-08 流和消息缓冲区
流缓冲区 流缓冲区一般用在不同设备或者不同进程间的通讯,为了提高数据处理效率和性能,设置的一定大小的缓冲区,流缓冲区可以用来存储程序中需要处理的数据、对象、报文等信息,使程序对可以对这些信息进行预处理、排序、过滤、拆…...
Java重修第五天—面向对象3
通过学习本篇文章可以掌握如下知识 1、多态; 2、抽象类; 3、接口。 之前已经学过了继承,static等基础知识,这篇文章我们就开始深入了解面向对象多态、抽象类和接口的学习。 多态 多态是在继承/实现情况下的一种现象…...
【征稿进行时|见刊、检索快速稳定】2024年经济发展与旅游管理国际学术会议(ICEDTM 2024)
【征稿进行时|见刊、检索快速稳定】2024年经济发展与旅游管理国际学术会议(ICEDTM 2024) 2024 International Conference Economic Development and Tourism Management(ICEDTM 2024) 一、【会议简介】 ICEDTM 2024将围绕"旅游管理”“经济发展”的最新研究领域ÿ…...
瑞_Java开发手册_(四)安全规约
🙊前言:本文章为瑞_系列专栏之《Java开发手册》的安全规约篇。由于博主是从阿里的《Java开发手册》学习到Java的编程规约,所以本系列专栏主要以这本书进行讲解和拓展,有需要的小伙伴可以点击链接下载。本文仅供大家交流、学习及研…...
Docker 安全必知:最佳实践、漏洞管理与监控策略
容器安全是实施和管理像 Docker 这样的容器技术的关键方面。它包括一组实践、工具和技术,旨在保护容器化应用程序及其运行的基础架构。在本节中,我们将讨论一些关键的容器安全考虑因素、最佳实践和建议。 容器隔离 隔离对于确保容器化环境的强大性和安全…...
【Flutter】多线程
Flutter 作为一个跨平台的UI库,前面的Flutter 架构有涉及到,Flutter 架构中的运行的多个线程。那么最为一个Flutter开发者,我们如何创建线程呢 多线程 上述我们提及到了,架构层涉及的多线程问题。比如说 主线程, 平台线程&#x…...
STM32-实时时钟RTC-1
...
node(express.js创建项目)+连接mysql数据库
1.node npm的安装 2.express的安装 全局安装:npm install express -gnpm install -g express-generator// ps: 4.0版本把generator分离出来了,需要单独安装3.创建express项目 express 项目名称 cd 项目名称 npm install npm start4.项目中安装数据库 npm install…...
【FLV】记录 H.264的解析
参考 FLV 文件格式分析 知乎大神的FLV文件格式分析。 FLV 首先下发9个字节的FLV 头 -2024-01-08 11:38:29.698 INFO [32196] [evplayer_client_main@153] player clinet run … 2024-01-08 11:38:29.702 INFO [2276] [evplayer_client_main::<lambda_1>::operator ()@14…...
nodejs+vue+ElementUi音乐分享社交网站77l8j
本文介绍的系统主要分为两个部分:一是前台界面:用户通过注册登录可以实现音乐播放、新闻浏览、留言评论等功能;另一个是后台界面:音乐网站管理员对用户信息进行管理,上传更新音乐资源,发布最新音乐资讯等功…...
进销存+小程序商城:实现批发零售企业的互联网转型与管理升级
在当今互联网高速发展的时代,越来越多的批发零售企业开始开始考虑转型。在这个行业中,企业要想取得更好的发展,就要积极地拥抱互联网。专属的订货商城小程序是企业转型的第一步。通过将进销存与订货商城一体化,企业可以更好地满足…...
Tomcat解压打包文件和并部署
一、文件压缩和上传解压 1.本地打包好dist.tar.gz文件 2.通过xftp拖拽上传到知道文件夹下,或者通过命令: cp dist.tar.gz /path/to/destination/folder注:将dist.tar.gz复制到 /path/to/destination/folder文件夹下,该文件夹只是举个例子怎么复制和解压! 3.进入/path/…...
JDK17
JDK 17是Java开发工具包(Java Development Kit)的一个版本。JDK是用于开发和运行Java应用程序的软件包,它包含了编译器、调试器、运行时环境和其他一些实用工具。JDK 17是Java的最新版本,它提供了许多新的功能、增强和改进。 使用…...
使用Docker运行SRS Stack
SRS Stack | SRS (ossrs.net) Docker 推荐使用Docker运行SRS Stack: docker run --restart always -d -it --name srs-stack -v $HOME/data:/data \-p 2022:2022 -p 2443:2443 -p 1935:1935 -p 8000:8000/udp -p 10080:10080/udp \registry.cn-hangzhou.aliyun…...
git安装教程 Windows 附安装包链接
Git是一款分布式源代码管理工具(版本控制工具) 。 git的作用 当你需要做一个大工程的时候,文件的管理无疑是非常庞大的工作,因为你需要不断的修改更新文件内容,同时可能还要保留旧版本保证可以复原,这样就需要备份多个版本的文件…...
TensorRT(C++)基础代码解析
TensorRT(C)基础代码解析 文章目录 TensorRT(C)基础代码解析前言一、TensorRT工作流程二、C API2.1 构建阶段2.1.1 创建builder2.1.2 创建网络定义2.1.3 定义网络结构2.1.4 定义网络输入输出2.1.5 配置参数2.1.6 生成Engine2.1.7 保存为模型文件2.1.8 释放资源 2.2 运行期2.2.1…...
如何查询MySQL中的树型表
在 MySQL 中查询树型表(即具有层级结构的表)可以使用递归查询或者使用嵌套集模型。下面分别介绍这两种方法: 递归查询:递归查询是通过自连接来实现的,可以使用 WITH RECURSIVE 关键字进行递归查询。假设有一个 catego…...
Programming Abstractions in C阅读笔记:p246-p247
《Programming Abstractions in C》学习第68天,p246-p247总结,总计2页。 一、技术总结 本章通过“the game of nim(尼姆游戏)”,这类以现实生活中事物作为例子进行讲解的情况,往往对学习者要求比较高,需要学习者具备…...
智能寻迹避障清障机器人设计(电路图附件+代码)
附 录 智能小车原理图 智能小车拓展板原理图 智能小车拓展板PCB 智能小车底板PCB Arduino UNO原理图 Arduino UNO PCB 程序部分 void Robot_Traction() //机器人循迹子程序{//有信号为LOW 没有信号为HIGHSR digitalRead(SensorRight);//有信号表明在白…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
