软件工程与计算总结(十三)详细设计中的模块化与信息隐藏
一.模块化与信息隐藏思想
1.设计质量
- 好的设计要着重满足以下3方面:可管理性、灵活性、可理解性
- 好的设计需要侧重于间接性和可观察性——简洁性使得系统模块易于管理(理解和分解)、开发(修改与调试)和复用。
- 实践者都同意可理解、易修改和易复用是软件设计中比较常见和重要的质量标准~
软件的变更是不可避免的,复用则是人们在实践中提高软件生产效率最好的方式之一,因此我们在设计过程中不得不考虑以上提到的软件质量特性,以使我们的软件成为好的软件~
2.动机
模块化和信息隐藏就是为了实现上述重要的质量标准而提出的设计方法,因为他们所针对的是最为重要的软件设计标准,被视为软件设计的核心思想之一。
在分解独立模块的过程中,方法是衡量模块的内聚性和耦合性,希望分解建立高内聚、低耦合的模块~
3.发展
总的来说,模块化和信息隐藏的思想是顺着下面的路线前进的:
- 从意识到要分解模块开始
- 之后人们慢慢意识到要分解出高内聚和低耦合的模块,使得结构化方法慢慢盛行起来,后来意识到从数据的角度来分解实现数据的封装
- 抽象数据类型提出之后,人们越来越意识到信息隐藏思路的重要性
- 再加上继承、多态等思想,完善了类和对象的概念,逐步走向了面向对象方法的世界
二.模块化
1.分解与模块化
分解:将系统分为多个小模块,降低复杂度
模块:一个词汇上邻接的程序语言序列,由边界元素限制范围,有一个聚合标识符(通俗的说就是一个可通过名称调用的代码片段)
在结构化方法中,代码片段式程序设计语言中的函数、过程和模块;而在面向对象方法中,代码片段则是面向对象程序设计语言中的类、方法和模块——无论具体存在如何,模块化的原则是通用的——尤其是最重要的高内聚低耦合原则:模块内部又最大的关联,模块之间有最小的关联~
2.结构化设计中的耦合
模块之间的联系越多,联系的复杂程度越高,模块之间的关系就约为复杂。
耦合:描述两个模块关系之间的复杂程度——模块耦合性越高,模块的划分越差,越不利于软件的变更和复用~
- 内聚耦合:最高级别的耦合,耦合性最强
- 公共耦合:较弱于前者,但耦合性仍然很强
- 重复耦合:非常隐蔽的耦合,往往不容易发现却危害甚大——同样的逻辑代码如果存在,在变更时就要同时修改多处
- 控制耦合:一个模块明确控制着另一个模块的逻辑——难点是两个模块都是非独立的,他们都需要知道另一个的内部结构和逻辑
- 印记耦合:如果把数据结构作为参数进行传输,被调用的模块只在该数据结构的个别组件上进行操作~(关键点在于共享的是数据结构)
- 数据耦合:模块之间通过参数传递,只共享对方需要的数据
(前3种是必须消除的,数据耦合是最理想的,另外两个是可以接受的)
3.结构化设计中的内聚
内聚:表达的是一个模块内部的联系的紧密性。
内聚性越高越好,越低越不容易实现变更和复用
- 偶然内聚:是指模块中执行的操作毫无关系,只是恰好堆砌在这个模块内。比如修车、烤蛋糕、遛狗、看电影放在一个模块内,没有任何联系。
- 逻辑内聚:指的是模块执行一系列逻辑上相似但没有直接关联的操作。比如乘坐汽车、乘坐火车、乘坐轮船和乘坐飞机,它们都是交通方式这个系列的操作。
- 时间类聚:也是模块中执行一系列操作,但是这些操作在同一时间段内发生。比如,我们睡觉前要把奶瓶放到门外、让猫出去溜达、关闭电视机和刷牙。这些都是在同一个时间段内完成,它们之间有时间相关性。
- 过程内聚:是模块执行的多个操作,是解决同一个问题的不同步骤。比如保养车的过程依次为洗车、消除凹痕、打磨和上蜡。这些子过程之间是有顺序关系的。
- 通信内聚则是模块内的操作都是针对同一数据进行的。比如查询书名、查询价格、查询出版社和查询作者。
- 功能内聚:只执行一个单一目的的操作。比如计算平方根、计算最短路径或者压缩数据库。
- 信息内聚:是模块内有一系列操作,每个操作都有各自的入口点和出口点,每个操作的代码相对独立,而且所有操作都是在相同的数据结构上完成,但是却形成一个抽象的整体。信息内聚的模块主要用来实现抽象的数据类型。
在上述各种内聚类型中,功能内聚和信息内聚是最好的两种,而且这两者的出发点不同,一个完全以功能(行为)为依据进行模块分解,一个以数据与功能间的相互支撑为依据进行模块分解,不可相互比较。一般而言,函数与过程应该是功能内的(信息内不适用于函数与过程),模块应该是信息内聚或功能内聚的,面向对象方法中的类应该是信息内聚与功能内聚兼顾的。
偶然内聚与逻辑内聚是不能接受的,如果软件中出现这两类内聚,一定要进行优化。
通信内聚、过程内聚、时间内聚这3种类型的内聚也是各自具有不同的出发点(一个是相同的数据;一个是相同的问题;一个是相同的时间),无法相互比较。这3种类型的内聚都是可以接受而且不可避免的。
三.信息隐藏
1.抽象信息与隐藏
- 抽象的本质就是总结提炼本质特征,消除非本质的细节,从而使得人们可以聚焦在本质上,降低认知的复杂性~
- 信息隐藏:本质上是利用了抽象的方法,抽象出每个类的关键细节,也就是模块的职责——什么是公开给其他人的,什么事隐藏在自己模块中的
- 换句话说,抽象出来的就是接口,隐藏的就是实现,他们共同体现了模块的职责——体现了抽象可以让面向对象方法拥有更好的效率和更多的灵活性~
- 核心设计思路:每个模块都隐藏一个重要的设计决策——对外表现为一份契约,并在这份契约之下隐藏着只有这个模块知道的设计决策或者秘密,决策实现的细节只有模块自己知道
2.信息与隐藏
模块的秘密:
- 根据需求分配的职责
- 内部实现机制
职责就是用一定的方式把模块的信息、秘密等隐藏起来~(隐藏独立变化的系统细节,分隔不一致变化的模块,只暴露出不容易变化的接口)
3.模块说明
即,用文档化的方式总结模块的设计决策,内容如下:
- 主要秘密:实现的用户需求
- 次要秘密:所设计的关键实现细节
- 角色:角色、作用、关系
- 对外接口:提供给别的模块
相关文章:

软件工程与计算总结(十三)详细设计中的模块化与信息隐藏
一.模块化与信息隐藏思想 1.设计质量 好的设计要着重满足以下3方面:可管理性、灵活性、可理解性好的设计需要侧重于间接性和可观察性——简洁性使得系统模块易于管理(理解和分解)、开发(修改与调试)和复用。实践者都…...
RF学习——器件的非线性失真分析
在大信号激励下的射频系统 在电路中,如果激励信号的幅度不可忽视,那么就会产生非线性失真。如二极管,晶体管等电路元件的特性在大信号激励下回变得非线性,输入和输出的形状不同,产生失真。 在功率放大器PA中,随着传输给负载的功率增大而迅速增大,传递功率的规格要始终考…...

SUB-1G SOC芯片DP4306F 32 位 ARM Cortex-M0+内核替代CMT2380F32
DP4306F是一款高性能低功耗的单片集成收发机,集成MO核MCU,工作频率可覆盖200MHiz^ 1000MHz。 支持230/408/433/470/868/915频段。该芯片集成了射频接收器、射频发射器、频率综合器、GFSK调制器、GFSK解调器等功能模块。通过SPI接口可以对输出功率、频道选…...
接收请求地址下载并输出文件流实现
代码: import httpxfrom datetime import datetime from io import BytesIO from fastapi.responses import StreamingResponse@router.get("/download", tags=["下载"]) async...

【iOS】——用单例类封装网络请求
文章目录 一、JSONModel1.JSONModel的简单介绍2.JSONModel的使用 二、单例类和Block传值 一、JSONModel 1.JSONModel的简单介绍 JSONModel一个第三方库,这个库用来将网络请求到的JSON格式的数据转化成Foundation框架下的Model类的属性,这样我们就可以直…...
再学Blazor——概述
简介 Blazor 是一种 .NET 前端 Web 框架,同时支持服务器端呈现和客户端交互性。 使用 C# 语言创建丰富的交互式 UI共享前后端应用逻辑可以生成混合桌面和移动应用受益于 .NET 的性能、可靠性和安全性需要有 HTML、CSS、JS 相关基础(开发 UI 框架的话&a…...

Ceph运维笔记
Ceph运维笔记 一、基本操作 ceph osd tree //查看所有osd情况 其中里面的weight就是CRUSH算法要使用的weight,越大代表之后PG选择该osd的概率就越大 ceph -s //查看整体ceph情况 health_ok才是正常的 ceph osd out osd.1 //将osd.1踢出集群 ceph osd i…...

RTSP协议
1 前言 RTSP协议作为音视频实时监控一个非常重要的协议,具有非常广泛的应用。RTSP由RFC 2326规范化,它允许客户端通过请求不同的媒体资源来控制流媒体服务器。RTSP是一种应用层协议,通常基于TCP连接,用于建立和控制媒体会话。这使…...

Maven系列第6篇:生命周期和插件详解?
maven系列目标:从入门开始开始掌握一个高级开发所需要的maven技能。 这是maven系列第6篇。 整个maven系列的内容前后是有依赖的,如果之前没有接触过maven,建议从第一篇看起,本文尾部有maven完整系列的连接。 前面我们使用maven…...

【通义千问】大模型Qwen GitHub开源工程学习笔记(4)-- 模型的量化与离线部署
摘要: 量化方案基于AutoGPTQ,提供了Int4量化模型,其中包括Qwen-7B-Chat和Qwen-14B-Chat。更新承诺在模型评估效果几乎没有损失的情况下,降低存储要求并提高推理速度。量化是指将模型权重和激活的精度降低以节省存储空间并提高推理速度的过程。AutoGPTQ是一种专有量化工具。…...

2022最新版-李宏毅机器学习深度学习课程-P23 为什么用了验证集结果还是过拟合
用了验证集还有可能会过拟合 这个片段可以从理论上证明这一点 以上整个挑选模型的过程也可以想象为一种训练。 把三个模型导出的最小损失公式看成一个集合,现在要做的就是在这个集合中找到某个h(此处可以视为训练),使得在验证集…...

Spring Cloud Alibaba—Sentinel 控制台安装
1、Sentinel 控制台包含如下功能: 查看机器列表以及健康情况:收集 Sentinel 客户端发送的心跳包,用于判断机器是否在线。 监控 (单机和集群聚合):通过 Sentinel 客户端暴露的监控 API,定期拉取并且聚合应用监控信息,最…...

基于动物迁徙优化的BP神经网络(分类应用) - 附代码
基于动物迁徙优化的BP神经网络(分类应用) - 附代码 文章目录 基于动物迁徙优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.动物迁徙优化BP神经网络3.1 BP神经网络参数设置3.2 动物迁徙算法应用 4.测试结果…...

一键搞定!黑群晖虚拟机+内网穿透实现校园公网访问攻略!
文章目录 前言本教程解决的问题是:按照本教程方法操作后,达到的效果是前排提醒: 1. 搭建群晖虚拟机1.1 下载黑群晖文件vmvare虚拟机安装包1.2 安装VMware虚拟机:1.3 解压黑群晖虚拟机文件1.4 虚拟机初始化1.5 没有搜索到黑群晖的解…...

【C语言】——通讯录(静态-动态增长-文件储存)
目录 前言: 一:整体框架 关于通讯录结构体的创建 二:通讯录的功能实现(静态) 2.1初始化通讯录 2.2增加联系人 2.3打印通讯录 2.4删除联系人 2.5 查找联系人 2.6修改联系人 2.7排序联系人 三:通…...

win10安装nginx及简单使用(命令)
下载 下载地址:http://nginx.org/en/download.html 使用 解压 更改配置 conf目录下nginx.conf 修改为未被占用的端口,地址改成你的地址 server {# 监听端口 listen 9010;# 地址 server_name 127.0.0.1;# 静态资源location / {root html;i…...
【农业生产系统模型】基于R语言APSIM模型进阶应用与参数优化、批量模拟实践技术
随着数字农业和智慧农业的发展,基于过程的农业生产系统模型在模拟作物对气候变化的响应与适应、农田管理优化、作物品种和株型筛选、农田固碳和温室气体排放等领域扮演着越来越重要的作用。APSIM (Agricultural Production Systems sIMulator)模型是世界知名的作物生…...
金融数学方法:梯度下降法
1.算法介绍 梯度下降法是一种常用的优化算法,其通过沿着梯度下降的方向迭代寻找局部极小值。如果沿着梯度上升的方向迭代,就可以找到极大值。 在梯度下降法中,我们首先需要选择一个初始点 x 0 x_0 x0作为起始位置,然后计算当前位…...
1031 查验身份证
一.问题: 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4…...
如何共享 Android 不同模块的构建配置
最近想重新梳理学习一遍 Android 的各个知识点,于是新建了一个 AndroidStudy 项目仓库,打算每个知识块新建 1 个 module。 类似这样: AndroidStudy (Root Project) ├─app (Module0) ├─CustomView (Module1) ├─KotlinCoroutines (Modul…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...