软件工程概论---内聚性和耦合性

目录

一.耦合性

1.内容耦合

2.公共耦合

4.控制耦合

5.标记耦合(特征耦合)

6.数据耦合

7.非直接耦合

二.内聚性

1.偶然内聚

2.逻辑内聚

3.时间内聚

4.过程内聚

5.通信内聚

6.顺序内聚

7.功能内聚


一.耦合性

耦合性是指软件结构中模块相互连接的紧密程度,是模块间相互连接性的度量耦合强度的大小是由模块间接口的复杂程度决定的。

具体从三个方面衡量:
① 方式——块间联系方式由“直接引用”或“过程语句调用”。
② 作用——块间传送的共用信息(参数)类型,可为“数据型”、“控制型”或“混合型” (数据/控制型)
③ 数量——块间传送的共用信息的数量。

模块分解的一个目标是使模块之间的联系尽可能少,实现目标可通过以下措施:
① 每个模块用过程语句(或函数方式等)调用其他模块。
② 模块间传送的参数为数据型。
③ 模块间公用的信息(如参数等) 尽量少

耦合的类型:

1.内容耦合

(1)一个模块直接访问另一模块的内部数据。

(2)一个模块不通过正常入口转到另一模块的内部。

(3)一个模块有多个入口。

(4)两个模块有部分代码重迭。

注:在高级语言中是不允许出现的,但在汇编语言中可能出现(所以在编写汇编语言中,要仔细检查,以免出现内容耦合)。

2.公共耦合

若干模块访问一个公共的数据环境(全局数据结构、共享的通信区、内存的公共覆盖区等)。耦合的复杂程度随耦合模块的数量的增加而显著增加。

公共耦合的两种情况:
松散公共耦合: 模块同时只对公共数据环境进行读或写一种操作;

注:松散公共耦合是目前使用较多的低耦合方式。

紧密公共耦合:若干模块对公共数据环境同时读和写操作;

这种耦合使公共数据区的变化影响所有公共耦合模块,严重影响模块的可靠性和可适应,降低软件的可读性。这是一种强耦合方式。

例如:

•无法控制各个模块对公共数据的存取,严重影响了软件模块的可靠性和适应性;

•使软件的可维护性变差。若一个模块修改了公共区的数据,则会影响与此数据相关的所有模块;
•降低了软件的可理解性。因为各个模块使用公共区数据的方式是隐含的,哪些数据被哪些模块共享,不容易搞明白,诊断错误困难。

一般来说,仅当模块间共享的数据很多,且通过参数的传递很不方便时才使用公共耦合。

3.外部耦合

一组模块都访问同一全局简单变量(而不是同一全局数据结构 ),而且不是通过参数表传递该全局变量的信息。

例如:static 静态变量就属于全局变量,会造成模块间耦合度较高,尽量少用全局变量

4.控制耦合

一个模块传递给另一模块的信息是用于控制该模块内部逻辑的控制信号。显然,对被控制模块的任何修改,都会影响控制模块。

改进:控制耦合中被调函数的判定,上移到主调函数当中,即可从控制耦合转化为数据耦合

5.标记耦合(特征耦合)

一个模块传送给另一个模块的参数是一个复合的数据结构。模块间共享了数据结构,如高级语言中的数组名、记录名等,其实传递的是这些数据结构的地址。标记耦合会使某些本来无关的模块产生相互依赖性,同时由于某些模块包含了不需要的数据,也给纠错带来了麻烦。

当我通过住户情况查用水量时,我只需要查用水量,但是同时也将用电量等其他数据也一起查询了

改进:将特征耦合转化为数据耦合

6.数据耦合

一个模块传送给另一个模块的参数是一个单个的数据项或者单个数据项组成的数组。模块间传递的是简单的数据值,相当于高级语言中的值传递。

7.非直接耦合

两个模块间没有直接的关系,它们分别从属于不同模块的控制与调用,它们之间不传递任何信息。这种耦合程度最弱,模块的独立性最高。

二.内聚性

内聚性表示一个模块内部各个元素(数据、处理)之间联系的紧密程度。显然,块内联系愈紧,即内聚性愈高,模块独立性愈好。

1.偶然内聚

又称为巧合型,为了节约空间,将毫无关系( 或者联系不多)的各元素放在一个模块中。模块元素关系松散,显然不易理解、不易修改。

P,Q,R中都有以下三行代码,但是三条语句毫无关系,并且A,B,C,D都不在CARD FILE当中,只是想要少写一些代码,就建立了模块T,模块T本身没有意义,这就是偶然内聚。

虽然空间上节省了部分空间,但是P,Q,R都需要调用模块T,效率上也是有损失的,不推荐。

2.逻辑内聚

将几个逻辑上相似的功能放在一个模块中,使用时由调用模块传递的参数确定执行的功能。
由于要传递控制参数,所以影响了模块的内聚性。
在图中,被调用模块首先要判定传递参数的含义,才能确定是进行读还是写操作。所以如果二者之间是控制耦合,那么被调用模块就是逻辑内聚型的模块。

3.时间内聚

又称为经典内聚。是把需要同时执行的成分放在一个模块中。比如初始化、中止操作这一类内部结构比较简单的模块。由于判定较少,因此比逻辑内聚高,但是由于内含多个功能,修改和维护困难。

4.过程内聚

一个模块内的处理元素是相关的,而且必须以特定的次序执行。一个模块内有多个功能成分。如:

5.通信内聚

模块中的成分引用共同的输入数据,或者产生相同的输出数据,则称为是通信内聚。下图中,加工记录模块和获得数据模块就是这样(加工数据模块与获得数据模块不会同时出现)。

通信内聚比时间内聚的内聚性高。这种模块一般可以通过数据流图来定义。

6.顺序内聚

一个模块内的处理元素都密切相关于同一功能,模块中某个成分的输出是另一成分的输入。
由于这类模块是按数据执行顺序,模块的一部分依赖于另外一部分,因此具有较好的内聚性。

例如,某模块完成二分检索功能,前一部分功能元素按某关键字递增排列,随后的功能按某关键字进行二分检索。

在下图中,编辑功能的输入是读入功能的输出,打印功能的输入是累加功能的输出。

:顺序内聚模块可能含有多个功能,也可能只含有不完整的部分功能。当模块含有多个功能时,如果修改某一功能,就要找出模块中这个功能的全部部分,修改时还要注意对其他功能的影响:如果模块只含有不完整的部分功能,修改时需要找出与完整功能有关的若干个相邻模块还需要了解这些模块都做些什么事情。

7.功能内聚

一个模块包括而且仅包括完成某一具体功能所必须的所有成分。或者说,模块的所有成分都是为完成该功能而协同工作、紧密联系、不可分割的。

编写或更改某个功能模块时,不需要考虑其他因素,该模块相对于其他模块也是独立的

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

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

相关文章

java常用应用程序编程接口(API)——String概述及使用案例

前言: 开始学到api的String,整理下心得。打好基础,daydayup! API: API是什么? API(Application Programming Interface)又名应用程序编程接口。是别人编好的程序的合集。 为什么要使用API&…

YOLOv5改进 | 2023Neck篇 | 利用Gold-YOLO针对小目标进行检测(附完整修改教程 + 代码)

一、本文介绍 本文给大家带来的改进机制是Gold-YOLO利用其Neck改进v8的Neck,GoLd-YOLO引入了一种新的机制——信息聚集-分发(Gather-and-Distribute, GD)。这个机制通过全局融合不同层次的特征并将融合后的全局信息注入到各个层级中,从而实现更高效的信息交互和融合。这种…

关于订单超时后用户却已支付的解决方案

场景: 一般我们下的一些订单,比如电商平台、外卖平台的都是有超时时间的,默认一般15或者30分钟,那么超时未支付订单会被自动取消,那么如果刚好有人在关闭订单的时候去支付成功了,或者说支付平台延迟了一下,…

开启Android学习之旅-5-Activity全屏

Android 两种方式设置全屏: 1. 第一行代码中的方法 通过 getWindow().getDecorView()方法拿到当前Activity的DecorView,再调用 setSystemUiVisibility() 方法来改变系统UI的显示,这里传入了 View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 和 View.SYSTEM_UI_…

【EAI 005】EmbodiedGPT:通过具身思维链进行视觉语言预训练的具身智能大模型

论文描述:EmbodiedGPT: Vision-Language Pre-Training via Embodied Chain of Thought 论文作者:Yao Mu, Qinglong Zhang, Mengkang Hu, Wenhai Wang, Mingyu Ding, Jun Jin, Bin Wang, Jifeng Dai, Yu Qiao, Ping Luo 作者单位:The Universi…

vue3 封裝一个常用固定按钮组件(添加、上传、下载、删除)

效果图 这个组件只有四个按钮&#xff0c;添加&#xff0c;上传、下载、删除&#xff0c;其中删除按钮的颜色默认是灰色&#xff0c;当表格有数据选中时再变成红色 实现 组件代码 <script lang"ts" setup> import { Icon } from /components/Icon/index im…

PCL 格网法计算点云的占地面积

目录 一、算法原理二、代码实现三、结果展示四、测试数据本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT生成的文章。 一、算法原理 该方法主要用于粗略统计机载点云的占地面积。方法原理是将点云沿 X O Y XOY

Rust 常用集合(上)

目录 1、使用 Vector 储存列表 1.1 新建 vector 1.2 更新 vector 1.3 读取 vector 的元素 1.4 遍历 vector 中的元素 1.5 使用枚举来储存多种类型 1.6 丢弃 vector 时也会丢弃其所有元素 2、使用字符串储存 UTF-8 编码的文本 2.1 什么是字符串&#xff1f; 2.2 新建字…

tiktok云手机有用吗?用哪个好?

很多做独立站的跨境卖家都会搭配一些社媒平台给自己引流带货&#xff0c;比如说目前很火的TikTok&#xff0c;这也是目前比较有效的一种引流方式。本文将介绍tiktok运营方法以及如何用tiktok云手机规避运营风险。 TikTok是个不错的风口&#xff0c;不过我们在国内想要运营好Tik…

如何在CentOS安装SQL Server数据库并通过内网穿透工具实现公网访问

文章目录 前言1. 安装sql server2. 局域网测试连接3. 安装cpolar内网穿透4. 将sqlserver映射到公网5. 公网远程连接6.固定连接公网地址7.使用固定公网地址连接 前言 简单几步实现在Linux centos环境下安装部署sql server数据库&#xff0c;并结合cpolar内网穿透工具&#xff0…

第19课 在Android环境中使用FFmpeg和openCV进行开发的一般步骤

在上节课&#xff0c;根据模板文件我们对在Android环境中使用FFmpeg和openCV进行开发有了一个初步的体验&#xff0c;这节课&#xff0c;我们来具体看一下其工作流程。 1.程序的入口 与VS2013程序开发类似&#xff0c;Android程序开发也有一个入口&#xff0c;在这个模板中&a…

哈希-力扣202快乐数

题目 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1&…

lm358充电器应用电路

什么是LM358 LM358是双运算放大器。内部包括有两个独立的、高增益、内部频率补偿的运算放大器&#xff0c;适合于电源电压范围很宽的单电源使用&#xff0c;也适用于双电源工作模式&#xff0c;在推荐的工作条件下&#xff0c;电源电流与电源电压无关。它的使用范围包括传感放…

「PyMuPDF 专栏 」PyMuPDF创建PDF、拆分PDF

文章目录 一、本章前言二、使用PyMuPDF创建PDF文档1、实例代码2、过程详解①. 安装PyMuPDF②. 导入PyMuPDF模块③. 创建一个新的PDF文档④. 添加页面和内容⑤. 保存文档 三、使用PyMuPDF拆分PDF文档1、实例代码2、过程解析①. 导入模块②. 定义函数③. 打开源PDF文件④. 遍历页…

数字后端设计实现之自动化useful skew技术(Concurrent Clock Data)

在数字IC后端设计实现过程中&#xff0c;我们一直强调做时钟树综合要把clock skew做到最小。原因是clock skew的存在对整体设计的timing是不利的。 但是具体到某些timing path&#xff0c;可能它的local clock skew对timing是有帮助的&#xff0c;比如如下图所示。 第一级FF到第…

C++面试宝典第16题:盛最多水的容器

题目 给定n个非负整数a1、a2、…、an,每个数代表坐标中的一个点(i, ai)。画n条垂直线,使得第i条垂直线的两个端点分别为(i, ai)和(i, 0)。找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。说明:不能倾斜容器,且n的取值至少为2。 在下图中,垂直线代表的输…

C++——冒泡排序

作用&#xff1a;最常用的排序算法&#xff0c;对数组内元素进行排序 1&#xff0c;比较相邻的元素&#xff0c;如果第一个比第二个大&#xff0c;就交换他们两个。 2&#xff0c;对每一对相邻元素做同样的工作&#xff0c;执行完毕后&#xff0c;找到第一个最大值。 3&…

RHCE9学习指南 第16章 访问NFS存储及自动挂载

16.1 访问NFS存储 前面介绍了使用本地存储&#xff0c;本章介绍使用网络上的存储设备。NFS全称是网络文件系统&#xff0c;所实现的是Linux和Linux之间的共享。 下面的练习我们将会在server上创建一个文件夹/share&#xff0c;然后通过NFS把它共享&#xff0c;然后在server2上…

LUT预设.cube格式PR/达芬奇/FCP/剪映等视频电影调色预设LUTs

对于将标准镜头转换为让人想起高端电影的视觉冲击场景至关重要。这些LUT经过专业设计&#xff0c;以模仿电影行业中的电影质量、深度和情感&#xff0c;使其成为电影制作人、摄像师和内容创作者的理想选择&#xff0c;希望为你的作品带来专业的电影色彩。 电影LUT的类别&#…

鸿蒙系统应用开发之开发准备

今天我们来聊一聊鸿蒙系统应用开发之前&#xff0c;要做什么准备工作&#xff0c;如下图所示&#xff0c;我们要做的就是安装DevEco Studio&#xff0c;然后配置开发环境。 老规矩&#xff0c;拍拍手&#x1f44f;&#xff0c;上菜。 安装DevEco Studio 首先我们打开链接HUAWEI…