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

目录

一.耦合性

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.功能内聚

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

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

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

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

相关文章

机器学习 前馈神经网络

人工神经网络(Artificial Neural Network,ANN)是指一系列受生物学和神经科学启发的数学模型.这些模型主要是通过对人脑的神经元网络进行抽象,构建人工神经元,并按照一定拓扑结构来建立人工神经元之间的连接…

大模型生成解码参数速查

控制输出长度的参数 控制所使用的生成策略的参数 用于操作模型输出 logits 的参数 定义“generate”输出变量的参数 可以在生成时使用的特殊字符

Java中SpringBoot组件集成接入【Knife4j接口文档(swagger增强)】

Java中SpringBoot组件集成接入【Knife4j接口文档】 1.Knife4j介绍2.maven依赖3.配置类4.常用注解使用1.实体类及属性(@ApiModel和@ApiModelProperty)2.控制类及方法(@Api、@ApiOperation、@ApiImplicitParam、 @ApiResponses)3.@ApiOperationSupport注解未生效的解决方法5.…

线扫相机品牌汇总(国外+国内)

线扫相机品牌汇总(国外+国内) 行者 ​ 热爱生活 22 人赞同了该文章 线扫相机也叫做线阵相机,和面阵相机一样,都是重要的工业相机。 线扫相机正如其名字那样,拍照时像扫描一样,相机和被拍照物体有相对匀速运动。 Perhaps the most common example of line scan imagin…

vue3 封装一个按钮组件(可自定义按钮样式)

效果图 鼠标悬浮有对应的文字提示&#xff0c;且图标出现背景色和颜色 实现 目前提供五个固定样式的图标及三个用户自定义的图标&#xff0c;可根据需要补充 组件代码 <script setup lang"ts"> import { onMounted, PropType, reactive, ref, watch } from v…

微创新与稳定性的权衡

之前做过一个项目&#xff0c;业务最高峰CPU使用率也才50%&#xff0c;是一个IO密集型的应用。里面涉及一些业务编排&#xff0c;所以为了提高CPU使用率&#xff0c;我有两个方案&#xff1a;一个是简单的梳理将任务可并行的采用并行流、额外线程池等方式做并行&#xff1b;另外…

Android14之解决刷机报错:Can not load Android system. Your data may be corrupt(一百七十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

后端程序员开发win小工具(未完待续)

github&#xff1a;https://gitee.com/forgot940629/win-tool-demo 本地启动&#xff0c;查看http://127.0.0.1:8080/form 场景 在日常工作中可能需要后端开发者开发一些辅助工具。这些辅助工具通常希望能想其他软件一样在桌面系统运行&#xff0c;并且有一些桌面应用的基本…

Unity组件开发--短连接HTTP

1.网络请求管理器 using LitJson; using Cysharp.Threading.Tasks; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Networking; using UnityEngine.Events;using System.Web; using System.Text; using Sy…

Spring事务(2):声明式事务管理案例-转账(xml、注解)

1 编写转账案例&#xff0c;引出事务管理问题 需求&#xff1a;账号转账&#xff0c;Tom账号取出1000元&#xff0c;存放到Jack账号上 1.1 建表脚本&#xff08;MySQL&#xff09; CREATE TABLE t_account (id INT(11) NOT NULL AUTO_INCREMENT,name VARCHAR(20) NOT NULL,m…

Qt QLabel标签控件

文章目录 1 属性和方法1.1 文本1.2 对齐方式1.3 换行1.4 图像 2. 实例2.1 布局2.2 为标签添加背景色2.3 为标签添加图片2.4 代码实现 QLabeI是Qt中的标签类&#xff0c;通常用于显示提示性的文本&#xff0c;也可以显示图像 1 属性和方法 QLabel有很多属性&#xff0c;完整的可…

学习笔记 | Activiti7

什么是工作流&#xff1f; 业务流程。 举个例子: 假设有一个在线博客平台&#xff0c;我们要让一篇新的文章从作者的头脑里发表出来。整个过程可以分为以下几个步骤&#xff1a; 创建文章草稿 &#xff1a;作者登录博客平台&#xff0c;点击“写新文章”的按钮&#xff0c…

实习学习总结(2023-12-14---2024-1-08)

CS汉化 首先下载CSagent&#xff0c;百度网盘中有 按照如下放置目录 使用出现中文乱码 插件使用乱码主要跟cs客户端加载没有指定UTF-8编码有关 指定编码的字符&#xff1a;-Dfile.encodingUTF-8 上面的字段添加到启动脚本里面即可&#xff0c;如&#xff1a; java -Dfile.e…

与AI合作 -- 写一个modern c++单例工厂

目录 前言 提问 bard给出的答案 AI答案的问题 要求bard改进 人类智能 AI VS 人类 前言 通过本文读者可以学到modern C单例模式工厂模式的混合体&#xff0c;同时也能看到&#xff1a;如今AI发展到了怎样的智能程度&#xff1f;怎样让AI帮助我们快速完成实现头脑中的想法&…

进阶分布式链路追踪

另外我的新书RocketMQ消息中间件实战派上下册&#xff0c;在京东已经上架啦&#xff0c;目前都是5折&#xff0c;非常的实惠。 https://item.jd.com/14337086.html​编辑https://item.jd.com/14337086.html “RocketMQ消息中间件实战派上下册”是我既“Spring Cloud Alibaba微…

读元宇宙改变一切笔记03_元素(下)

1. 元素2&#xff1a;3D&#xff0c;互联网的下一个伟大迈进 1.1. 3D的必要性不仅仅是因为它预示着新事物的出现 1.1.1. 为了使人类文化和劳动实现从物理世界向数字世界的过渡&#xff0c;必须借助3D环境 1.2. 用户通过几乎源源不断的高分辨…

JVM工作原理与实战(十):类加载器-Java类加载器

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、介绍 二、扩展类加载器 三、通过扩展类加载器去加载用户jar包 1.放入/jre/lib/ext下进行扩展 2.使用参数进行扩展 四、应用程序类加载器 总结 前言 ​JVM作为Java程序的运行…

Python——运算符

num 1 num 1 print("num1:", num) num - 1 print("num-1:", num) num * 4 print("num*4:", num) num / 4 print("num/4:", num) num 3 num % 2 print("num%2:", num) num ** 2 print("num**2:", num) 运行结果…

【Linux Shell】10. 函数

文章目录 【 1. 函数的定义 】【 2. 函数参数 】 【 1. 函数的定义 】 所有函数在使用前必须定义 。这意味着必须将函数放在脚本开始部分&#xff0c;直至shell解释器首次发现它时&#xff0c;才可以使用。 调用函数仅使用其函数名即可 。 函数返回值在调用该函数后通过 $? 来…

我的阿里云服务器被攻击了

服务器被DDoS攻击最恶心&#xff0c;尤其是阿里云的服务器受攻击最频繁&#xff0c;因为黑客都知道阿里云服务器防御低&#xff0c;一但被攻击就会进入黑洞清洗&#xff0c;轻的IP停止半小时&#xff0c;重的停两个至24小时&#xff0c;给网站带来很严重的损失。而处理 ddos 攻…