软件设计不是CRUD(10):低耦合模块设计理论——业务抽象:从需求中提取业务维度

news2024/11/18 13:56:58

接上文《软件设计不是CRUD(9):低耦合模块设计理论——设计落地所面临的挑战》

2、什么是业务抽象

业务抽象是一种将需求落地成模块功能的设计思想,是对业务需求和技术设计进行转换、隔离的一种分析方法。经过业务抽象后的业务模块一般具有较高的业务屈服度,能更大程度满足模块设计中的基本原则要求。进行业务抽象设计有以下几个关键工作步骤:

  • 提取业务维度:业务抽象的一个工作是在需求中提取到变化的业务维度,以及各个业务维度的工作关系。这些业务维度的提取对模块的设计落地至关重要。这些业务维度可能是相互影响的,也可能是独立存在的,但相互影响的场景占大多数情况。

  • 确认模块分层:从各个业务模块中提取的业务维度,也是后续确认各个模块所处分层的重要依据。就像上文描述的那样,模块的业务维度自身变化风险越大的模块应该置于应用系统中的更上层;业务维度自身变化风险越小的模块或者与业务无关的工具类型的模块,应该置于应用系统中的更下层。这样的设计目的是保证模块在必须进行设计调整时,调整成本最小。确认模块分层也是后续进行各模块间模型关联性设计、行为关联设计的前提。

  • 抽象模型:业务抽象的另一个工作是基于业务维度和确定的模块分层,来定义最小业务模型——满足业务模块的各种模型结构的最大公约数。或者说业务模型之所以能在这个业务模块中工作,其最小应该具备的业务定义。举例来说,各种订单模型之所以能在订单模块中工作,是因为无论哪种订单模型都具有订单类型、订单编号和订单租户这三个业务信息。再例如,租户模块中工作的各种租户信息,都必须具有唯一的租户编号,否则就不认为是租户模型,就不能在租户模块中工作。

  • 抽象行为:业务抽象的最后一个工作,是从需求中提取业务模块的关键行为。这些行为分为两种类型:控制逻辑和业务逻辑。业务逻辑是存在于需求场景的各个业务操作点,和之前从需求中提取出来的业务维度紧密相关。例如验证单据正确性、激活通知、发送消息都是独立的业务操作点;控制逻辑是一条或者多条将业务逻辑在各个业务操作点上串联起来的控制方式。好的业务模块设计中,业务逻辑和控制逻辑都可以进行扩展(注:本专题后续文章将重点讲解如何利用设计模式对抽象的行为进行设计落地)。

在这里插入图片描述

从上图可知,基于业务抽象进行功能模块设计时,设计目标是完成模型和行为的抽象。为了完成这个设计目标,首先需要从需求中抽取业务维度。本文先来详细介绍第一个话题:如何寻找需求中的业务维度,并进行实例演示。

3、需求中的业务维度

正如上文所描述的那样,业务维度是在业务边界内的可变要素,当业务维度的要素出现不同的值时,会对业务行为产生不同的影响,甚至会分裂出不同的业务走向。提取的每一个业务维度将在随后的设计中形成被控制逻辑管理的一个个关键业务操作点。在以上对于业务维度的描述定义中,读者需要注意几个关键点:

  • 在业务边界内的

进行订单业务模块的需求分析时,能不能将出库单类型提取成一个业务维度呢?很明显这是不行的,因为订单业务模块和出库单业务模块从经验上来讲就是两个不同的模块(绝大多数实际业务场景也是这样的),在设计时他们就应该具有业务隔离性。好的、稳定的分层设计后,订单模块甚至都可能不再知晓有一个出库模块的存在

有的读者可能会提出质疑,怎么会不行呢?出库单类型万一和订单类型有关呢?例如普通订单生成普通的出库单,赠品补单性质的订单生成补货出库单。两者怎么会没有关联呢?就算需求确实是这样的,库存的处理业务也是在订单业务之外。以上提出的质疑只能说是如何划分业务边界的问题,而不是边界内如何提取业务维度的问题。订单在创建成功后,完全可以通过事件通知、状态通知的方式,将订单已经创建好的状态告知出库模块,再由出库模块自身决定如何进行后续出库业务的处理。换句话说,就是一种模块间行为的关联方式。

  • 可以变化的要素

提取出来的业务维度,其值一定是可变的,并且完成设计后其值也是可扩展的。例如订单类型原始提供了两个值:销售订单、采购订单,这两种订单类型所代表的业务场景是完全不一样。并且这个订单类型维度还可允许二次开发团队进行值的扩展(当然值的扩展也就意味着业务逻辑的扩展)

3.1、业务维度存在的形式

绝大多数情况下,设计人员从需求中提取出来的业务维度都具有一定的关联性,这和业务维度的本身的特点有关:业务维度是需求中可变化的要素,既然是可变化的要素其变化后必然对周围的事物产生或多或少的影响。这种需求的示例可以列举很多,例如:当指挥员身份为资深船长时,才能指挥5万吨以上舰艇作战;只有订单类型为退货订单时,不需要在订单结束后发送短信,改为发送邮件……

业务维度在业务性需求中一定存在且至少有一个,否则业务功能落地后将是一潭死水

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nginx设置域名转发到服务器指定的端口

🍁 作者:知识浅谈,CSDN签约讲师,CSDN博客专家,华为云云享专家,阿里云专家博主 📌 擅长领域:全栈工程师、爬虫、ACM算法 💒 公众号:知识浅谈 🔥网站…

git提交文本或者word到git教程,git创建仓库时候自带

简易的命令行入门教程: Git 全局设置: git config --global user.name “XX” git config --global user.email “XXXqq.com” 创建 git 仓库: mkdir test cd test git init touch README.md git add README.md git commit -m “first commit” git remote add origin https:…

一款全面且多功能的安全扫描仪

工具介绍 Trivy(发音)是一款全面且多功能的安全扫描仪。Trivy 拥有用于查找安全问题的扫描仪,以及可以找到这些问题的目标。 目标(Trivy 可以扫描的内容): 容器镜像 文件系统 Git 存储库(远…

基础篇_开发web程序(C/S架构,SpringBoot,贷款计算器-WEB版)

文章目录 一. C/S 架构1. C/S 架构2. URL 格式 二. Spring Boot1. 向导生成2. 准备工作1) 修改版本2) 修改maven 设置 3. 导入模块4. hello world5. 处理输入页面接收参数练习 - 加法 三. 贷款计算器 - WEB 版1. 数组定义改写贷款计算器越界遍历默认值 2. 二维数组3. 贷款计算器…

基于ssm的疫情防控管理系统设计与实现论文

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装疫情防控管理系统软件来发挥其高效地信息处理的作用&#x…

感知器学习算法和Adaline规则

一.感知器的发展过程 感知器的发展可以追溯到20世纪50年代。它是一种简单的人工神经网络模型,最早由美国心理学家和计算机科学家弗兰克罗森布拉特(Frank Rosenblatt)于1957年提出。感知器的设计灵感来源于生物神经元的工作原理,旨…

【Spring】SpringBoot 统一功能处理

文章目录 前言1. 拦截器1.1 什么是拦截器1.2 拦截器的使用1.2.1 自定义拦截器1.2.2 注册配置拦截器 1.3 拦截器详解1.3.1 拦截路径1.3.2 拦截器执行流程1.3.3 适配器模式 2. 统一数据返回格式3. 统一异常处理 前言 在日常使用 Spring 框架进行开发的时候,对于一些板…

flutter给组件设置背景图的操作

可以设置背景图的组件只有一个,那就是Container容器,要想设置背景图,可以使用网路图片,也可以使用本地图片,要是使用本地图片,需要在本地添加一个资源路径,用来管理这些文件,在本地项…

若依框架实现排序【升序或降序】很简单

前端实现 1. 在表格上加监听函数sort-change。如下红框所示: 2. 在表行上加排序字:sort-orders,可排序字sortable。如下红框所示: 3. 添加监听函数实现。代码如下: handleSortChange(column) {this.queryParams.orderByColumn …

【深入理解 ByteBuf 之三 接口类拆解】2. Recycler 接口设计真正的回收机制

Recycler 回收器接口设计 本节接着 ObjectPool 的设计脉络,具体看看其具体实现 RecyclerObjectPool 中引用的 Recycler 究竟是怎么实现的 这一张图基本已经说明白了,我再做个总结,对细节感兴趣的可以看看我下面带源码的注释。 对于 Recycle…

debian 11 arm64 aarch64 源码变异winehq arm64 笔记

安装华为毕昇编译器 sudo apt install libc1-13 编译tools cd tools su root export PATH/opt/bisheng-compiler-1.3.3-aarch64-linux/bin:$PATH rootdebian:/home/yeqiang/下载/src/wine/tools# ../configure CC/opt/bisheng-compiler-1.3.3-aarch64-linux/bin/clang C…

职场硬货:刚入职面对陌生的被测系统, 没有需求文档如何快速熟悉?

各位小伙伴大家好, 今天为大家分析一下在企业中, 如果快速的上手被测系统/软件, 了解产品目标业务需求, 做到尽快尽职完成测试工作。 找到所有可能的相关文档 尽可能找到项目开发计划书, 项目签订的合同, 一般合同中会包含项目研发背景, 与产品及功能点概述, 这样可以先了解项…

一文速学-selenium高阶性能优化技巧

一文速学-selenium高阶性能优化技巧 前言 最近写的挺多自动化办公的selenium程序没有做优化,执行效率不高,启动浏览器又慢但是又可能出现其他不可控的因素,总结来说虽然放心运行但是又没那么好用,项目是写完了最后还是需要优化结…

Hive分区表实战 - 多分区字段

文章目录 一、实战概述二、实战步骤(一)创建学校数据库(二)创建省市分区的大学表(三)在本地创建数据文件1、创建四川成都学校数据文件2、创建四川泸州学校数据文件3、创建江苏南京学校数据文件4、创建江苏苏…

在线项目实习|2024寒假项目实战火热报名中!

一、在线实习项目分类 二、在线实习项目流程 三、在线实习项目优惠及项目特色 1、师傅带练教学模式,手把手教你掌握 采用“师带徒”的教学模式,课程以“项目前置知识学习 师傅带练 项目实战”贯穿,强调动手实操,内容以代码落地为…

反向代理的本质是什么?

反向代理是一种网络架构模式,通常用于提供静态内容、处理安全、负载均衡和缓存等任务。在这种架构中,客户端发送的请求首先到达反向代理服务器,然后由反向代理服务器将请求转发给后端的实际服务器。反向代理服务器可以处理和修改请求和响应&a…

命名空间 “Eigen“ 没有成员 “SelfAdjointEigenSolver“

代码中用到SelfAdjointEigenSolver 结果报错&#xff1a;报错实在windows10条件下发生的。 查找资料&#xff0c;最后还是要定位到官方文档。 计算自伴随矩阵的特征值和特征向量。 这是在特征值模块中定义的。 添加如下引用即可解决&#xff0c;请点赞关注。 #include <…

2023 年公链发展报告

作者&#xff1a;stellafootprint.network 2023 年&#xff0c;公链领域展现出强大的韧性和持续的创新力。这一年&#xff0c;比特币的强势回归、以太坊的稳步增长以及 Solana 的惊人崛起&#xff0c;共同绘制出一幅市场复苏的生动画面。在这一背景下&#xff0c;公链加密货币…

华媒舍:高效率的新闻资讯新闻媒体宣发套餐内容推广计划方案

怎样让自己的新闻资讯可以被大众孰知&#xff0c;变成了每一个新闻媒体宣发者一同存在的困难。下面我们就给大家介绍一套高效率的新闻资讯新闻媒体宣发套餐内容推广计划方案&#xff0c;致力于帮助新闻媒体宣发者提升宣发高效率&#xff0c;提高新闻资讯的传播性。 1.新闻媒体宣…

2023年全国电子签章政策汇总,契约锁提供具有法律效力的电子签章

2023年&#xff0c;国务院及各地政府办公厅、市监局、住建委等机关部门&#xff0c;持续推动电子签章、电子合同等功能在“政府采购、工程项目审批、企业开办等”领域深化应用&#xff0c;加快实现电子签章互信互认&#xff0c;不断简化办事流程&#xff0c;让越来越多高频常办…