软件设计不是CRUD(12):低耦合模块设计理论——业务抽象:模块分层操作

接上文《软件设计不是CRUD(11):低耦合模块设计理论——业务抽象:规划模块分层》

3、模块的边界

上篇文章的内容基本上说清楚了模块为什么要进行分层设计,以及模块分层设计所遵循的基本原则。本节内容我们就来讨论一下如何实际进行模块的分层规划。前文已经提到,在完成从需求中提取业务维度的工作后,需求中的模块拆解情况只是设计人员基于对原始需求初步的理解、基于自身的工作经验进行的拆解。随着模块分层设计的深入,这些被初步划分的功能模块可能会进行再拆分、再合并、再添加甚至进行删除操作。

既然模块是一组行为和模型的集合,那么模块的边界当然就包括行为边界和模型边界。并且模型边界的确认将对模块边界划分起到决定性作用,行为边界只是模型边界确认后进行模块内功能设计的必然产物

3.1、模块中的模型边界

业务模型主要是指业务主体和连接这些业务主体的关联信息。业务主体,是功能模块中可以独立进行增删改操作的业务单元。业务主体是一个抽象概念,在不同的场景实现中业务主体的实现情况可能不一样。诸如订单基本信息和订单商品明细信息就是某种场景下订单业务主体的一种典型实现。其它场景下,订单基本信息+订单商品明细+订单物资占用明细又可能是另一种订单业务主体的具体实现。

一个功能模块中一定会有一个业务主体,并且一个功能模块中存在多个业务主体的情况也是有的。例如费用模块中就可能就有两个业务主体:费用类型和费用凭证,两个业务主体(费用类型和费用凭证)可以单独进行维护。这两个业务主体虽然独立进行维护,但绝大多数情况下又需要组合起来构成一个费用模块整体,向外部其它模块提供服务。在外部模块看来,一张单据只要具有费用类型编号和费用凭证编号,就是一张有效的费用单据

关联信息就是描述业务主体之间如何进行关联,这个关联信息可能是描述的两个业务主体如何进行关联,也可能是描述的多个业务主体如何进行关联。也就是说功能模块中要存在两个或者两个以上的业务主体,才会有关联信息。关联信息如果处于模块内,那么说明被关联的两个或者多个业务主体可能存在于同一个功能模块;关联业务模型如果处于模块外,那么说明被关联的两个或者多个业务主体一定不存在于同一个功能模块中。

在这里插入图片描述

请不要尝试用关系型数据库中的数据表概念来理解本节描述的业务模型。数据表是一种具体的设计落地形式,而业务模型是业务抽象中对于模块中业务数据的一种抽象表达。如果说两者真的存在什么联系,那么联系仅限于业务模型的一种具体落地实现是数据库中的一张或者多张数据表。数据表和数据表的关联和本节描述的关联模型也不是一个概念,诸如订单数据表和订单商品明细表看似是一种关联信息,但实际上两个表都属于同一个业务主体的一种具体实现形式,并不是主体和主体之间的关联信息。

那么有一个问题就需要进行思考了,当两个业务主体不在一个模块内,那么他们的关联信息应该由哪个模块进行维护?或者换一个更好理解的提问方式:模块A和模块B存在信息关联,那么关联信息应该怎么进行维护?这里有三个选项:

A、关联信息应该放在模块A的边界外,由模块B进行管理
B、关联信息应该放在模块A的边界内,由模块A进行管理
C、应该单独有一个模块C,专门管理关联信息。

首先应该排除选项C,因为前文已经明确描述到:“一个模块中一定会有一个业务主体”,显然模块间的关联信息并不是一个业务主体,所以不可能单独创建模块而仅仅用来管理关联关系。另外,两个业务主体不在一个模块内且两个业务主体又存在关联信息,那么势必导致承载这两个业务主体的功能模块存在关联。两个模块存在关联,势必出现一个模块依赖另一个模块的情况(注意:这种依赖肯定需要杜绝循环依赖的情况)。两个模块存在依赖关系,又势必出现两个模块存在上下层关系。

那么以上的问题还可以进行简化:当模块A和模块B存在信息关联时,那么关联信息应该由上层模块进行维护,还是由下层模块进行维护。回答这个被再次简化的问题,相信对读过本专栏之前内容的读者应该不难。由于模块分层的一个原则就是,上层模块对下层模块透明,而关联信息中明显会包括两个业务主体的关键信息(例如关联的费用类型编号 + 费用凭证编号),所以读者应该能很快得出一个结论:关联信息应该由上层模块进行维护,否则下层模块就需要知晓上层模块的存在,至少是上层模块的某些关系信息的存在。

在这里插入图片描述

由上层模块维护关联关系,可以保证上层模块中的各主体模型(的关键信息)不会泄露给下层模块。但这个原则也不是一成不变的,如果设计者能够找到所有关联信息的共性,并保证这个共性在上层模块的任何扩展过程中都保持不变,且都能找到唯一对应的业务信息,那么也可以将基于这个共性的关联信息,交给下层模块进行维护。

例如,订单模块作为上层模块,无论是销售订单的实现、补货订单的实现、赠品订单的实现,其订单信息和发货单的对应,都是通过订单类型 + 订单编号这两个信息作为关联依据的,并且后续无论什么样的订单和发货单关联,也都能且只能通过订单类型 + 订单编号的方式和发货单进行关联。那么这时,订单业务和到货单业务的关联信息,就可以由处于下层的到货单业务

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

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

相关文章

机器人内部传感器阅读笔记及心得-位置传感器-电位器式位置传感器

位置传感器 位置感觉是机器人最基本的感觉要求,可以通过多种传感器来实现。位置传感器包括位置和角度检测传感器。常用的机器人位置传感器有电位器式、光电式、电感式、电容式、霍尔元件式、磁栅式及机械式位置传感器等。机器人各关节和连杆的运动定位精度要求、重…

数字之美:探索人工智能绘画的奇妙世界

目录 引言AI绘画的定义与发展历程定义与发展历程AI绘画产品有哪些? AI绘画的应用领域设计与创意产业影视与游戏制作数字艺术与展览 AI绘画的基本原理与技术深度学习与神经网络生成对抗网络(GAN)风格迁移算法 AI绘画效果展示一只带着墨镜的小猫在高楼林立…

尾矿库排洪系统结构仿真软件WKStruc(可试用)

1、背景介绍 尾矿库作为重大危险源之一,在国际灾害事故排名中位列第18位,根据中国钼业2019年8月刊《中国尾矿库溃坝与泄漏事故统计及成因分析》的统计,在46起尾矿库泄漏事故中,由于排洪设施导致的尾矿泄漏事故占比高达1/3&#x…

手机连接电脑后资源管理器无法识别(识别设备但无法访问文件)

问题描述 小米8刷了pixel experience系统,今天用电脑连接后无法访问手机文件,但是手机选择了usb传输模式为文件传输 解决办法 在设备和打印机页面中右键选择属性 点击改变设置 卸载驱动,注意勾选删除设备的驱动程序软件 卸载后重新连接手机,电脑弹出希望对设备进行什么操作时…

家庭能耗监控系统

随着能源成本的不断上升和环保意识的增强,家庭能耗监控系统变得越来越重要。这种系统是智能家居技术的一部分,它使得家庭用户能够实时监视和管理其能源使用情况,从而达到节能减排的目的。 一、系统组成 家庭能耗监控系统通常由传感器、智能计…

FPGA_SD卡读写

一 SD卡 SD卡,安全数字卡,体积小,容量大,存储速度块,支持热插拔。 二 SD卡存储容量 SD卡类型协议规范容量等级SDSCSD1.0上限至2GBSDHCSD2.02GB至32GBSDXCSD3.032GB至2TB 三 SD卡速度等级 标志串列数据写入速度UHS…

Liunx 免费证书配置 带自动续期

安装完 nginx 之后 执行 yum install certbot 安装完后接着安装 python3-certbot-nginx 插件. 对于 Ubuntu/Debian 系统: sudo apt-get update sudo apt-get install certbot python3-certbot-nginx对于 CentOS/RHEL 系统: sudo yum install epel…

Spring 类型转换、数值绑定与验证(一)— DataBinder

DataBinder 是Spring用于数据绑定、类型转换及验证的类。使用场景有:1)xml配置文件定义bean,Spring 内部使用DataBinder 来完成属性的绑定;2)Web请求参数绑定,在Spring MVC 中,Controller的方法参数通常会自…

【k近邻】Kd树构造与最近邻搜索示例

【k近邻】 K-Nearest Neighbors算法原理及流程 【k近邻】 K-Nearest Neighbors算法距离度量选择与数据维度归一化 【k近邻】 K-Nearest Neighbors算法k值的选择 【k近邻】 Kd树的构造与最近邻搜索算法 【k近邻】 Kd树构造与最近邻搜索示例 近邻法的实现需要考虑如何快速搜索个最…

Python习题详解

练习&#xff1a; 1&#xff0c;计算100以内奇数的和 #计算100以内所有奇数的和 sum 0 # n 1 # while n < 100: # # sum sum n # sum n # # n n 2 # n 2 # print(sum) n 99 #求偶数时n 100 while n > 0: sum n # n n - 2 n - 2 print(sum)2&#xff0c;打印…

缓存篇—缓存穿透

当发生缓存雪崩或击穿时&#xff0c;数据库中还是保存了应用要访问的数据&#xff0c;一旦缓存恢复相对应的数据&#xff0c;就可以减轻数据库的压力&#xff0c;而缓存穿透就不一样了。 当用户访问的数据&#xff0c;既不在缓存中&#xff0c;也不在数据库中&#xff0c;导致…

论文阅读《Sylph: A Hypernetwork Framework for Incremental Few-shot Object Detection》

论文地址&#xff1a;https://arxiv.org/abs/2203.13903 代码地址&#xff1a;https://github.com/facebookresearch/sylph-few-shot-detection 目录 1、存在的问题2、算法简介3、算法细节3.1、基础检测器3.2、小样本超网络3.2.1、支持集特征提取3.2.2、代码预测3.2.3、代码聚合…

【Vulkan Tutorials 01】【环境搭建】三角形例子

Development Environment&#xff08;开发环境&#xff09; 1. 安装Vulkan SDK 官网 2. 安装cmake和minGW 2.1 cmake 官网 双击可执行文件&#xff0c;然后直接安装&#xff0c;注意环境变量选择设置&#xff0c;否则需要自己操作。 2.2 minGW 官网 下载如下图所示&am…

【Pytorch深度学习开发实践学习】B站刘二大人课程笔记整理lecture08数据集导入和构建

lecture08数据集导入和构建 课程网址 Pytorch深度学习实践 部分课件内容&#xff1a; import torch from torch.utils.data import Dataset, DataLoader import numpy as npclass DiabetesDataset(Dataset):def __init__(self):xy np.loadtxt(diabetes.csv.gz, delimiter,, …

Sora:打开视频创作新纪元的魔法钥匙

随着人工智能技术的飞速发展&#xff0c;AI视频模型已成为科技领域的新热点。而在这个浪潮中&#xff0c;OpenAI推出的首个AI视频模型Sora&#xff0c;以其卓越的性能和前瞻性的技术&#xff0c;引领着AI视频领域的创新发展。让我们将一起探讨Sora的技术特点、应用场景以及对未…

vulnhub靶场之Deathnote

一.环境搭建 1.靶场描述 Level - easy Description : dont waste too much time thinking outside the box . It is a Straight forward box . This works better with VirtualBox rather than VMware 2.靶场下载 https://www.vulnhub.com/entry/deathnote-1,739/ 3.启动环…

【linux】shell命令 | Linux权限

目录 1. shell命令以及运行原理 2. Linux权限的概念 3. Linux权限管理 3.1 文件访问者的分类 3.2 文件类型和访问权限 3.3 文件权限值的表示方法 3.4 文件访问权限的相关设置方法 4. file指令 5. 目录的权限 6. 粘滞位 7. 关于权限的总结 1. shell命令以及运行原理 …

05.STLvector、list、stack、queue

STL标准模板库 standard template library STL将原来常用的容器和操作进行封装&#xff0c;增加了C的编码效率 容器 string #include vector #include list #include stack #include queue #include set #include map #include 迭代器 容器和算法之间的粘合剂&#xff0…

js 多对象去重(多属性去重)

需求中发现后端可能没有处理重复数据&#xff0c;这个时候前段可以直接解决。 在 JavaScript 中&#xff0c;可以使用 Set 数据结构来进行多对象的去重。Set 是 ES6 新引入的集合类型&#xff0c;其特点是元素不会重复且无序。 下面是一个示例代码&#xff0c;展示如何通过 S…

Nginx----高性能的WEB服务端

一、Nginx介绍 1、什么是Nginx Nginx Nginx是一个高性能的HTTP和反向代理服务器。是一款轻量级的高性能的web服务器/反向代理服务器/电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器&#xff0c;单台物理服务器可支持30 000&#xff5e;50 000个并发请求。 一款高性能…