当前位置: 首页 > news >正文

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

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

2、什么是业务抽象

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

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

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

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

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

在这里插入图片描述

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

3、需求中的业务维度

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

  • 在业务边界内的

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

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

  • 可以变化的要素

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

3.1、业务维度存在的形式

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

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

相关文章:

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

接上文《软件设计不是CRUD(9):低耦合模块设计理论——设计落地所面临的挑战》 2、什么是业务抽象 业务抽象是一种将需求落地成模块功能的设计思想,是对业务需求和技术设计进行转换、隔离的一种分析方法。经过业务抽象后的业务模块一般具有较高的业务屈服度,能更大程度满…...

S1-08 流和消息缓冲区

流缓冲区 流缓冲区一般用在不同设备或者不同进程间的通讯,为了提高数据处理效率和性能,设置的一定大小的缓冲区,流缓冲区可以用来存储程序中需要处理的数据、对象、报文等信息,使程序对可以对这些信息进行预处理、排序、过滤、拆…...

Java重修第五天—面向对象3

通过学习本篇文章可以掌握如下知识 1、多态; 2、抽象类; 3、接口。 之前已经学过了继承,static等基础知识,这篇文章我们就开始深入了解面向对象多态、抽象类和接口的学习。 多态 多态是在继承/实现情况下的一种现象&#xf…...

【征稿进行时|见刊、检索快速稳定】2024年经济发展与旅游管理国际学术会议(ICEDTM 2024)

【征稿进行时|见刊、检索快速稳定】2024年经济发展与旅游管理国际学术会议(ICEDTM 2024) 2024 International Conference Economic Development and Tourism Management(ICEDTM 2024) 一、【会议简介】 ICEDTM 2024将围绕"旅游管理”“经济发展”的最新研究领域&#xff…...

瑞_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

本文介绍的系统主要分为两个部分&#xff1a;一是前台界面&#xff1a;用户通过注册登录可以实现音乐播放、新闻浏览、留言评论等功能&#xff1b;另一个是后台界面&#xff1a;音乐网站管理员对用户信息进行管理&#xff0c;上传更新音乐资源&#xff0c;发布最新音乐资讯等功…...

进销存+小程序商城:实现批发零售企业的互联网转型与管理升级

在当今互联网高速发展的时代&#xff0c;越来越多的批发零售企业开始开始考虑转型。在这个行业中&#xff0c;企业要想取得更好的发展&#xff0c;就要积极地拥抱互联网。专属的订货商城小程序是企业转型的第一步。通过将进销存与订货商城一体化&#xff0c;企业可以更好地满足…...

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开发工具包&#xff08;Java Development Kit&#xff09;的一个版本。JDK是用于开发和运行Java应用程序的软件包&#xff0c;它包含了编译器、调试器、运行时环境和其他一些实用工具。JDK 17是Java的最新版本&#xff0c;它提供了许多新的功能、增强和改进。 使用…...

使用Docker运行SRS Stack

SRS Stack | SRS (ossrs.net) Docker​ 推荐使用Docker运行SRS Stack&#xff1a; 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的作用 当你需要做一个大工程的时候&#xff0c;文件的管理无疑是非常庞大的工作&#xff0c;因为你需要不断的修改更新文件内容&#xff0c;同时可能还要保留旧版本保证可以复原&#xff0c;这样就需要备份多个版本的文件…...

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 中查询树型表&#xff08;即具有层级结构的表&#xff09;可以使用递归查询或者使用嵌套集模型。下面分别介绍这两种方法&#xff1a; 递归查询&#xff1a;递归查询是通过自连接来实现的&#xff0c;可以使用 WITH RECURSIVE 关键字进行递归查询。假设有一个 catego…...

Programming Abstractions in C阅读笔记:p246-p247

《Programming Abstractions in C》学习第68天&#xff0c;p246-p247总结&#xff0c;总计2页。 一、技术总结 本章通过“the game of nim(尼姆游戏)”&#xff0c;这类以现实生活中事物作为例子进行讲解的情况&#xff0c;往往对学习者要求比较高&#xff0c;需要学习者具备…...

智能寻迹避障清障机器人设计(电路图附件+代码)

附 录 智能小车原理图 智能小车拓展板原理图 智能小车拓展板PCB 智能小车底板PCB Arduino UNO原理图 Arduino UNO PCB 程序部分 void Robot_Traction() //机器人循迹子程序{//有信号为LOW 没有信号为HIGHSR digitalRead(SensorRight);//有信号表明在白…...

设计模式-- 3.适配器模式

适配器模式 将一个类的接口转换成客户希望的另外一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 角色和职责 请求者&#xff08;client&#xff09;&#xff1a;客户端角色,需要使用适配器的对象&#xff0c;不需要关心适配器内部的实现&#xff0c;…...

设计一个简单的规则引擎

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术&#x1f525;如果感觉博主的文章还不错的…...

openssl3.2 - 官方demo学习 - digest - EVP_MD_stdin.c

文章目录 openssl3.2 - 官方demo学习 - digest - EVP_MD_stdin.c概述笔记END openssl3.2 - 官方demo学习 - digest - EVP_MD_stdin.c 概述 使用 SHA3-512 对stdin输入做摘要, 并输出摘要值. 笔记 /*! \file EVP_MD_stdin.c \note openssl3.2 - 官方demo学习 - digest - EVP…...

浅谈 Raft 分布式一致性协议|图解 Raft

前言 大家好&#xff0c;这里是白泽。本文是一年多前参加字节训练营针对 Raft 自我整理的笔记。 本篇文章将模拟一个KV数据读写服务&#xff0c;从提供单一节点读写服务&#xff0c;到结合分布式一致性协议&#xff08;Raft&#xff09;后&#xff0c;逐步扩展为一个分布式的…...

4_【Linux版】重装数据库问题处理记录

1、卸载已安装的oracle数据库。 2、知识点补充&#xff1a; 3、调整/dev/shm/的大小 【linux下修改/dev/shm tmpfs文件系统大小 - saratearing - 博客园 (cnblogs.com)】 mount -o remount,size100g /dev/shm 4、重装oracle后没有orainstRoot.sh 【重装oracle后没有orains…...

隧道应用2-netsh端口转发监听Meterpreter

流程介绍&#xff1a; 跳板机 A 和目标靶机 B 是可以互相访问到的&#xff0c;在服务器 A 上可以通过配置 netsh 端口映射访问 B 服务器。如果要拿 B 服务器的权限通常是生成正向后门&#xff0c;使用 kali 的 msf 正向连接B服务器&#xff0c;进而得到 Meterpreter&#xff0c…...

《Spring》--使用application.yml特性提供多环境开发解决方案/开发/测试/线上--方案1

阿丹有话说&#xff1a; 有不少同志有疑问说我正常开发的时候&#xff0c;需要自己搭建项目的时候。总是出现配置文件环境切换出现问题。多环境系列会出两个文章解决给搭建重点解决一下这个问题。给与两种解决的方案。正确让大家只需要按照步骤操作就可以完成。 原理&#xf…...

统计项目5000+,出具报表5分钟......捷顺科技数据中台怎么做?

捷顺创立于1992年&#xff0c;以智慧车行、人行出入口软硬件产品为依托&#xff0c;致力于智慧停车生态建设和运营&#xff0c;是出入口智能管理和智慧生态环境建设的开创者和引领者。 历经近三十年的发展&#xff0c;已经成为国内智慧停车领域的领军企业。公司集研、产、销一…...

力扣(105. 从前序与中序遍历序列构造二叉树,106. 从中序与后序遍历序列构造二叉树)

题目1链接 题目1&#xff1a; 思路&#xff1a;使用前序确定根&#xff0c;使用中序分左右子树&#xff0c;分治法。 难点&#xff1a;如何控制递归确定左右子树。 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* T…...

网络安全技术新手入门:在docker上安装dvwa靶场

前言 准备工作&#xff1a;1.已经安装好kali linux 步骤总览&#xff1a;1.安装好docker 2.拖取镜像&#xff0c;安装dvwa 一、安装docker 输入命令&#xff1a;sudo su 输入命令&#xff1a;curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key …...