软件设计不是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);//有信号表明在白…...
逆向工程实战:从V8引擎角度破解JavaScript无限debugger(保姆级教程)
V8引擎深度解析:JavaScript调试机制与安全实践 在JavaScript开发领域,调试器(debugger)是开发者日常工作中不可或缺的工具。作为Chrome浏览器和Node.js的核心引擎,V8对debugger关键字的处理机制直接影响着开发者的调试体验。本文将深入探讨V8…...
从零开始:使用TCP调试助手V1.9进行网络通信调试的完整流程
从零开始:使用TCP调试助手V1.9进行网络通信调试的完整流程 在软件开发与网络调试领域,TCP/UDP通信测试是每个开发者迟早要面对的必修课。无论是物联网设备的数据传输验证,还是分布式系统的组件间通信检查,一个可靠的调试工具能让我…...
XZ1851输入电压6-40V 输出电流2.5A 输出电压ADJ(小于39V)
产品概述 XZ1851 是一款内置功率 MOSFET的单片降压型开关模式转换器。 XZ1851在 6-40V 宽输入电源范围内实现2.5 A最大输出电流,并且具有出色的线电压和负载调整率。 XZ1851 采用 PWM 电流模工作模式,环路易于稳定并提供快速的瞬态响应。 XZ1851 外部提供…...
深入解析SAC算法:从最大熵原理到机器人控制实践
1. SAC算法为什么值得关注 第一次听说SAC(Soft Actor-Critic)算法时,我和大多数强化学习新手一样困惑:为什么这个算法能在机器人控制领域迅速走红?直到在机械臂抓取项目中亲自尝试后,我才真正理解它的独特价值。 SAC最吸引人的特点…...
C语言:结构体(自定义类型)
目录 1. 声明 1.1 结构体的声明 1.2 结构体自引用 2. 结构体内存对齐(热门考点) 2.1 对齐规则 2.3 修改默认对齐数 3.结构体传参 4. 结构体实现位段 4.1 位段 4.2 内存分配 4.3 跨平台问题 4.4 位段的应用:IP数据报 4.5 注意事项…...
【LeArm】从零玩转机械臂(一):开箱、配网与基础控制实战
1. LeArm机械臂开箱初体验 第一次拿到LeArm机械臂的包装箱时,明显能感受到厂家在包装上的用心。打开外层纸箱后,内部还有一层泡沫保护层,所有部件都被固定在定制泡沫槽位里,这种包装方式让我想起了高端电子产品的开箱体验。取出所…...
从QEMU仿真到真机烧录:用Yocto为ArmSoM-Sige7开发板定制RK3588镜像的完整流程
从QEMU仿真到真机烧录:用Yocto为ArmSoM-Sige7开发板定制RK3588镜像的完整流程 在嵌入式开发领域,能够快速验证软件栈的可行性并最终部署到真实硬件是每个开发者的核心诉求。本文将带你完整走通从虚拟仿真到实体部署的全链路,使用Yocto项目为搭…...
提示词工程完全指南
提示词工程完全指南 Prompt Engineering Complete Guide 来源参考:OpenAI 官方指南、DAIR.AI Prompt Engineering Guide、IBM、Google Research、斯坦福 CS224N 整理用于学习交流 目录 什么是提示词工程六大核心策略(OpenAI 官方)基础技巧进…...
Degrees of Lewdity中文本地化终极指南:从零开始畅玩完整汉化版
Degrees of Lewdity中文本地化终极指南:从零开始畅玩完整汉化版 【免费下载链接】Degrees-of-Lewdity-Chinese-Localization Degrees of Lewdity 游戏的授权中文社区本地化版本 项目地址: https://gitcode.com/gh_mirrors/de/Degrees-of-Lewdity-Chinese-Localiza…...
飞书机器人深度集成:OpenClaw+Qwen3-32B-Chat智能问答系统搭建
飞书机器人深度集成:OpenClawQwen3-32B-Chat智能问答系统搭建 1. 项目背景与需求拆解 去年底接手了一个技术团队的知识库建设项目,需要为百人规模的研发团队搭建一个智能问答系统。核心诉求是:通过飞书机器人接口,让成员能快速查…...
