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

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

目录

一.耦合性

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

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

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

注:我们可以看到,模块越细分,模块的内聚性是越高的,那么是不是模块越细分越好呢,其实不然,模块细分,那么模块数目也会增加,如图,当模块数目增加时每个模块的规模将减小,开发单个模块需要的成本(工作量)确实减少了;但是,随着模块数目增加,设计模块间接口所需要的工作量也将增加。

相关文章:

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

目录 一.耦合性 1.内容耦合 2.公共耦合 4.控制耦合 5.标记耦合(特征耦合) 6.数据耦合 7.非直接耦合 二.内聚性 1.偶然内聚 2.逻辑内聚 3.时间内聚 4.过程内聚 5.通信内聚 6.顺序内聚 7.功能内聚 一.耦合性 耦合性是指软件结构中模块相互…...

纯血鸿蒙「扩圈」100天,酝酿已久的突围

坦白讲,去年参加华为开发者大会看到HarmonyOS NEXT(仅运行鸿蒙原生应用,所以也称作「纯血鸿蒙」)的时候,小雷也没料想到鸿蒙原生应用生态的发展速度会如此之快。 9月25日,华为正式对外宣布启动HarmonyOS NE…...

UICollection Compositional Layout全详解

本文字数:8325字 预计阅读时间:45分钟 01 Collection View Layout全详解 UICollectionView在iOS中是构建复杂布局的强大工具。iOS13中引入的 UICollectionViewCompositionalLayout为创建自定义布局提供了全新的可能性。本文将深入探讨Compositional Lay…...

单例模式的模板

参考了网上的一些单例模式&#xff0c;自己也写一个模板。 要点&#xff1a; 线程安全性单例对象的唯一性 #include <mutex> //在模板类 Singleton 中&#xff0c;可以定义单例模式的实现细节 template <typename T> class Singleton { public://通过删除拷贝构造…...

C#基础-空处理

在c#中&#xff0c;值对象是没有办法赋值为null的。比如说&#xff0c;你想要定义一个布尔值&#xff0c;你的赋值数据要么得是true、要么就得是false&#xff0c;默认情况下我们永远没可能给这个布尔赋值为null&#xff0c;即使只是对这个变量进行声明而不初始化数据&#xff…...

测试平台开发vue组件化重构前端代码

基于 springbootvue 的测试平台开发 继续更新&#xff08;人在魔都 T_T&#xff09;。 这期其实并不是一个详细的开发过程记录&#xff0c;主要还是针对本次前端重构来聊聊几个关注点。 目前重构的总进度在80%&#xff0c;重构完的页面没什么变化&#xff0c;再回顾一下。 一…...

龍运当头--html做一个中国火龙祝大家龙年大吉

🐉效果展示 🐉HTML展示 <body> <!-- partial:index.partial.html --> <svg><defs><g id=...

Dockerfile语法和简单镜像构建

Dockerfile是一个用于定义Docker镜像的文本文件&#xff0c;包含了一系列的指令和参数&#xff0c;用于指示Docker在构建镜像时应该执行哪些操作&#xff0c;例如基于哪个基础镜像、复制哪些文件到镜像中、运行哪些命令等。 Dockerfile文件的内容主要有几个部分组成&#xff0c…...

uniapp使用wxml-to-canvas开发小程序保存canvas图片

微信小程序官方解决方案&#xff1a;wxml-to-canvas 使用wxml-to-canvas要知道一些前提条件 1、只能画view&#xff0c;text&#xff0c;image 2、每个元素必须要设置宽高 3、默认是flex布局&#xff0c;可以通过flexDirection: "column"来改变排列方式 4、文字 必…...

关于数据库切换的麻烦

背景介绍 现项目使用了两个数据源&#xff0c;分别为A、B&#xff0c;两个数据库的数据结构并不相同&#xff0c;数据库A是用来做查询一些基本信息的&#xff0c;数据库B是用来保留业务操作数据的。后端是在mapper层用DS注解来区分哪些地方用数据库A&#xff0c;而哪些地方用数…...

Qt/QML编程学习之心得:Linux下读写文件File(24)

在Linux嵌入式系统中,经常会使用Qt来读写一个文件,判断一个文件是否存在,具体如何实现呢? 首先,要使用linux系统中相关的头文件: #include <unistd.h> #include <stdio.h> #include <stdlib.h> 其次,判断路径是否存在, if(!dir.exists()){mkdir(…...

【Vue2+3入门到实战】(22)VUE3之组合式API - setup、reactive和ref函数、computed、watch、生命周期函数详细讲解

目录 一、组合式API - setup选项1. setup选项的写法和执行时机2. setup中写代码的特点3. <script setup>语法糖 二、组合式API - reactive和ref函数1. reactive2. ref3. reactive 对比 ref 三、组合式API - computed四、组合式API - watch1. 侦听单个数据2. 侦听多个数据…...

如何在互联网上找到你想要的数据?

互联网时代&#xff0c;信息爆炸&#xff0c;怎么在网上查到到自己想要的信息已经变难了。毕竟经常搜索的内容前几页都是广告。 那么如何在大量的广告和垃圾信息中获取到自己想要的信息呢? 首先&#xff0c;明确自己的需求&#xff0c;比如你想找哪个方面的数据&#xff0c;…...

揭秘淘宝商品详情API如何助力电商创新发展

淘宝商品详情API是淘宝开放平台提供的一种数据接口服务&#xff0c;能够获取到淘宝网商品详情的各种信息&#xff0c;包括商品标题、价格、销量、评价等。通过淘宝商品详情API&#xff0c;开发者可以轻松地获取到这些数据&#xff0c;并利用这些数据进行商业分析和应用开发。 …...

vue element plus Space 间距

虽然我们拥有 Divider 组件&#xff0c;但很多时候我们需要不是一个被 Divider 组件 分割开的页面结构&#xff0c;因此我们会重复的使用很多的 Divider 组件&#xff0c;这在我们的开发效率上造成了一定的困扰。 间距组件就是为了解决这种困扰应运而生的。 基础用法# 最基础…...

【驱动序列】C#获取电脑硬件之CPU信息,以及它都有那些品牌

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是是《驱动序列》文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识…...

目标检测-One Stage-YOLO v3

文章目录 前言一、YOLO v3的网络结构和流程二、YOLO v3的创新点总结 前言 根据前文目标检测-One Stage-YOLOv2可以看出YOLOv2的速度和精度都有相当程度的提升&#xff0c;但是精度仍较低&#xff0c;YOLO v3基于一些先进的结构和思想对YOLO v2做了一些改进。 提示&#xff1a;…...

安泰ATA-4014高压功率放大器在传感器脉冲涡流检测中的应用

传感器在工程领域起着至关重要的作用&#xff0c;能够实时获取各种物理量的信息。而功率放大器作为传感器信号处理的重要组成部分&#xff0c;广泛应用于各种测量和控制系统中。本文将探讨功率放大器在这一领域的重要性和作用。 首先&#xff0c;了解传感器脉冲涡流检测的基本原…...

Axure全面指南:正确打开并高效使用的步骤!

AxureRP是目前流行的设计精美的用户界面和交互软件。AxureRP根据其应用领域提供了一组丰富的UI控制。作为Axure的国内替代品&#xff0c;即时设计可以在线协作&#xff0c;浏览器可以在无需下载客户端的情况下打开和使用。如果以前使用Axure&#xff0c;很容易切换到即时设计。…...

ts axios 指定返回值类型,返回数据类型不确定该怎么办 typescript

ts axios 指定返回值类型&#xff0c;返回数据类型不确定该怎么办 typescript 转到 ts 以来&#xff0c;一直有个问题困扰着我&#xff0c;就是每次用 axios 获取数据时&#xff0c;返回值 res 的类型都不能确定&#xff0c;这就导致编辑器一直提示我&#xff1a; 原因 原因是…...

判断是否是json字符串

一、在isJson.js文件里创建一个isJson类并抛出 /*** isJson 类用于判断一个字符串是否为有效的 JSON 字符串。* class isJson* param {string} str - 要判断的字符串。* returns {boolean} 如果字符串是有效的 JSON 字符串&#xff0c;则返回 true&#xff1b;否则返回 false。…...

SpringBoot集成Minio(接上文)

如果启动项目出现下面错误&#xff0c;把minio的版本更换为低版本的&#xff0c;我最初用的是8.5.7版本的出现下面错误&#xff0c;后面一直调低版本发现8.2.2&#xff0c;8.3.0都是可以的。&#xff08;因为我需要用8.5.7的版本所以调了别的依赖的版本&#xff0c;大家可以根据…...

更新 torchtext 造成的torch版本不匹配的问题

更新 torchtext 造成的torch版本不匹配的问题 - pip 原来的版本配置 cuda11.6 torch-GPU 1.13.1 如果直接pip update torchtext 会卸载原来的torch然后默认安装CPU版本&#xff0c;很烦。网上的各种方法都是推荐conda.但是我一直都是pip。因此考虑pip 的解决办法。 解决办…...

flutter资源

开发者平台 腾讯云 https://cloud.tencent.com/developer/article/1902681 掘金 stackoverflow 个人博主 Magic旭 https://www.jianshu.com/u/f9b0b77d6038 J船长 https://juejin.cn/user/1820446987136903/posts 老孟 http://www.laomengit.com/flutter/widgets/Theme.html#t…...

C++经典程序

C有许多经典的程序示例&#xff0c;以下是其中一些简单但常见的例子&#xff0c;以帮助你更好地了解C语言的基本概念。 1. **Hello World程序:** cpp #include <iostream> int main() { std::cout << "Hello, World!" << std…...

Java多线程-Thread类的run方法

Java多线程-Thread类的run方法 一、背景二、研究Thread类的start()源码1、源码&#xff08;比较短&#xff0c;贴一下&#xff09;1.1 重点&#xff1a;start0(); 三、研究Thread类的run()源码1、源码&#xff08;很关键&#xff0c;必须贴&#xff09; 四、创建线程的2种方式1…...

java基础之Java8新特性-方法引入

目录 1.简介 2.方法引入 方法引入遵循规范 方法引入种类 1.静态方法引入 2.对象方法引入 3.实例方法引入 4.构造函数引入 1.简介 方法引用是 Java 8 中引入的另一个重要特性&#xff0c;它提供了一种简洁的语法来直接引用现有方法或构造函数。方法引用可以看作是 Lambd…...

K8S中的hostPort、NodePort 、targetPort、port、containerPort 的区别

Dockerfile的EXPOSE Dockerfile中端口的声明: EXPOSE <端口1> [<端口2>...] 所以:EXPOSE的 第一个作用:只是说明docker容器开放了哪些端口,并没有将这些端口实际开放了出来!更多的作用是告诉运维人员或容器操作人员我开放了容器的哪些端口,只是一种说明。 …...

SpringBoot整合FreeMarker模板引擎

中文官方参考手册 http://freemarker.foofun.cn/ 1.先加入FreeMarker依赖 <dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.23</version> </dependency>2.新建一个FreeMark…...

编程基础 - 变量与常量

编程基础 - 变量与常量 返回序言及专栏目录 文章目录 编程基础 - 变量与常量前言一、变量是什么&#xff1f;二、为什么要有变量三、局部变量和全局变量四、常量五、只读变量小结 前言 变量是编程最重要知识点之一&#xff0c;从根本上讲&#xff0c;编程就是对数据的操作&a…...

家具网站建设案例/市场监督管理局是干什么的

/**处理金额的千分位转为数字**/ functio StrToNumber(obj){var reg /^[0-9].?[0-9]*$/; //验证字符串是否是数字if (!(reg.test(obj))) {//为字符串 则判断是否存在,if((obj"").replace(/^\s\s*/, ).replace(/\s\s*$/, )""){return 0.00 ;}if(obj unde…...

小题狂做 官方网站/找培训机构的平台

在Windows 2000/XP系统中位于C:\Winnt\System32\Drivers\Etc 目录中。该文件其实是一个纯文本的文件&#xff0c;用普通的文本编辑软件如记事本等都能打开。 用记事本打开hosts文件&#xff0c;首先看见了微软对这个文件的说明。这个文件是根据TCP/IP for Windows 的标准来工作…...

网站建设的七个流程步骤/在哪里打广告效果最好

API简介 vpp其实也有自己的control-plane。它们之间的就是使用API来交互&#xff0c;底层是用的共享内存机制。control-plane可以是使用不同的语言来写&#xff0c;支持C/python/java/go 在这里了解的是用C语言与vpp通信。如图1所示。VAT通过命令行来控制VPP。 图1&#xff0c;…...

网站开发制作公司/怎么找到精准客户资源

这几天主要是狂看源程序&#xff0c;在弥补了一些曾经知识空白的同一时候&#xff0c;也学会了不少新的知识(比方 NIO)。或者称为新技术吧。线程池就是当中之中的一个&#xff0c;一提到线程。我们会想到曾经《操作系统》的生产者与消费者。信号量&#xff0c;同步控制等等。一…...

中建国际建设有限公司官网/网站推广优化业务

1、安装前须知版本&#xff1a;mysql-5.7.24平台&#xff1a;Linux环境&#xff1a;Centos 72、安装前的必要检查和准备(不要遗漏任何一步骤)(1)、检查系统是否已经安装过mysql[rootlocalhost /]# rpm -qa | grep mysql例如下图所展示&#xff0c;就存在两个记录[rootlocalhost…...

网站制作哪个公司好/搜索引擎竞价广告

查看软件xxx安装内容#dpkg -L xxx 查找软件#apt-cache search 正则表达式查找文件属于哪个包#dpkg -S filename apt-file search filename 查询软件xxx依赖哪些包#apt-cache depends xxx 查询软件xxx被哪些包依赖#apt-cache rdepends xxx 增加一个光盘源#sudo apt-cdrom ad…...