耦合性(Coupling),也叫耦合度,是对模块间关联程度的度量。耦合的强弱取决与模块间接口的复杂性、调用模块的方式以及通过界面传送数据的多少。模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、数据传递关系。模块间联系越多,其耦合性越强,同时表明其独立性越差。软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准。划分模块的一个准则就是高内聚低耦合。

一般模块之间可能的连接方式有七种,构成耦合性的七种类型。它们之间的关系为(耦合性性由强到弱):

  • 内容耦合(Content Coupling) 
    如果发生下列情形,两个模块之间就发生了内容耦合。

    1. 一个模块直接访问另一个模块的内部数据;
    2. 一个模块不通过正常入口转到另一模块内部;
    3. 两个模块有一部分程序代码重叠(只可能出现在汇编语言中);
    4. 一个模块有多个入口。
  • 公共耦合(Common Coupling) 
    若一组模块都访问同一个公共数据环境,则它们之间的耦合就称为公共耦合。公共的数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区等。

  • 外部耦合(External Coupling) 
    一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称之为外部耦合。

  • 控制耦合(Control Coupling) 
    如果一个模块通过传送开关、标志、名字等控制信息,明显地控制选择另一模块的功能,就是控制耦合。

  • 标记耦合(Stamp Coupling) 
    如果一组模块通过参数表传递记录信息,就是标记耦合。它是某一数据结构的子结构,而不是简单变量。

  • 数据耦合(Data Coupling) 
    如果一个模块访问另一个模块时,彼此之间是通过数据参数(不是控制参数、公共数据结构或外部变量)来交换输入、输出信息的,则称这种耦合为数据耦合。

  • 非直接耦合(Nondirect Coupling) 
    如果两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的,这就是非直接耦合。这种耦合的模块独立性最强。

高内聚低耦合

内聚是从功能角度来度量模块内的联系,一个好的内聚模块应当恰好做一件事。它描述的是模块内的功能联系;
耦合是软件结构中各模块之间相互连接的一种度量,耦合强弱取决于模块间接口的复杂程度、进入或访问一个模块的点以及通过接口的数据。

中文名
高内聚低耦合
范    围
计算机科学软件结构

目录

  1. 1 定义
  2. 2 概念
  3. 3 知识

定义

编辑

高内聚低耦合,是软件工程中的概念,是判断设计好坏的标准,主要是面向对象的设计,主要是看类的内聚性是否高,耦合度是否低。

概念

编辑

耦合性:也称块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及传递的信息
内聚性:又称块内联系。指模块的功能强度的度量,即一个模块内部各个元素彼此结合的紧密程度的度量。若一个模块内各元素(语名之间、程序段之间)联系的越紧密,则它的内聚性就越高。
所谓高内聚是指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则。
耦合:一个软件结构内不同模块之间互连程度的度量。
对于低耦合,粗浅的理解是:一个完整的系统,模块与模块之间,尽可能的使其独立存在。也就是说,让每个模块,尽可能的独立完成某个特定的子功能。模块与模块之间的接口,尽量的少而简单。如果某两个模块间的关系比较复杂的话,最好首先考虑进一步的模块划分。这样有利于修改和组合。[1]

知识

编辑

软件架构设计的目的简单说就是在保持软件内在联系的前提下,分解软件系统,降低软件系统开发的复杂性,而分解软件系统的基本方法无外乎分层和分割。但是在保持软件内在联系的前提下,如何分层分割系统,分层分割到什么样的粒度,并不是一件容易的事,这方面有各种各样的分解方法,比如:关注点分离,面向方面,面向对象,面向接口,面向服务,依赖注入,以及各种各样的设计原则等,
耦合可以分为以下几种,它们之间的耦合度由高到低排列如下:
(1) 内容耦合:一个模块直接访问另一模块的内容,则称这两个模块为内容耦合。
若在程序中出现下列情况之一,则说明两个模块之间发生了内容耦合:
1. 一个模块直接访问另一个模块的内部数据。
2. 一个模块不通过正常入口而直接转入到另一个模块的内部。
3. 两个模块有一部分代码重叠(该部分代码具有一定的独立功能)。
4. 一个模块有多个入口。
内容耦合可能在汇编语言中出现。大多数高级语言都已设计成不允许出现内容耦合。这种耦合的耦合性最强,模块独立性最弱。
(2) 公共耦合:一组模块都访问同一个全局数据结构,则称之为公共耦合。公共数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区等。如果模块只是向公共数据环境输入数据,或是只从公共数据环境取出数据,这属于比较松散的公共耦合;如果模块既向公共数据环境输入数据又从公共数据环境取出数据,这属于较紧密的公共耦合。
公共耦合会引起以下问题:
1. 无法控制各个模块对公共数据的存取,严重影响了软件模块的可靠性和适应性。
2. 使软件的可维护性变差。若一个模块修改了公共数据,则会影响相关模块。
3. 降低了软件的可理解性。不容易清楚知道哪些数据被哪些模块所共享,排错困难。
一般地,仅当模块间共享的数据很多且通过参数传递很不方便时,才使用公共耦合。
(3) 外部耦合:一组模块都访问同一全局简单变量,而且不通过参数表传递该全局变量的信息,则称之为外部耦合。
(4) 控制耦合:模块之间传递的不是数据信息,而是控制信息例如标志、开关量等,一个模块控制了另一个模块的功能。
(5) 标记耦合:调用模块和被调用模块之间传递数据结构而不是简单数据,同时也称作特征耦合。表就和的模块间传递的不是简单变量,而是像高级语言中的数据名、记录名和文件名等数据结果,这些名字即为标记,其实传递的是地址。
(6) 数据耦合:调用模块和被调用模块之间只传递简单的数据项参数。相当于高级语言中的值传递。
(7) 非直接耦合:两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的。耦合度最弱,模块独立性最强。
总结:耦合是影响软件复杂程度和设计质量的一个重要因素,为提高模块的独立性,应建立模块间尽可能松散的系统,在设计上我们应采用以下原则:若模块间必须存在耦合,应尽量使用数据耦合,少用控制耦合,慎用或有控制地使用公共耦合,并限制公共耦合的范围,尽量避免内容耦合。
内聚有如下的种类,它们之间的内聚度由弱到强排列如下:
(1) 偶然内聚:一个模块内的各处理元素之间没有任何联系,只是偶然地被凑到一起。这种模块也称为巧合内聚,内聚程度最低。
(2) 逻辑内聚:这种模块把几种相关的功能组合在一起, 每次被调用时,由传送给模块参数来确定该模块应完成哪一种功能 。
(3) 时间内聚:把需要同时执行的动作组合在一起形成的模块称为时间内聚模块。 
  (4) 过程内聚:构件或者操作的组合方式是,允许在调用前面的构件或操作之后,马上调用后面的构件或操作,即使两者之间没有数据进行传递。简单的说就是如果一个模块内的处理元素是相关的,而且必须以特定次序执行则称为过程内聚。
  (5) 通信内聚:指模块内所有处理元素都在同一个数据结构上操作或所有处理功能都通过公用数据而发生关联(有时称之为信息内聚)。即指模块内各个组成部分都使用相同的数据数据或产生相同的数据结构。
  (6) 顺序内聚:一个模块中各个处理元素和同一个功能密切相关,而且这些处理必须顺序执行,通常前一个处理元素的输出时后一个处理元素的输入。
例如某模块完成工业产值求值的功能,前一个功能元素求总产值,后一个功能元素求平均产值,显然该模块内两部分紧密关联。
顺序内聚的内聚度比较高,但缺点是不如功能内聚易于维护。
(7) 功能内聚:模块内所有元素的各个组成部分全部都为完成同一个功能而存在,共同完成一个单一的功能,模块已不可再分。即模块仅包括为完成某个功能所必须的所有成分,这些成分紧密联系、缺一不可。
功能内聚是最强的内聚,其优点是它的功能明确。判断一个模块是否功能内聚,一般从模块名称就能看出。如果模块名称只有一个动词和一个特定的目标(单数名词),一般来说就是功能内聚,如:“计算水费”、“计算产值”等模块。功能内聚一般出现在软件结构图的较低层次上。
功能内聚模块的一个重要特点是:他是一个“暗盒”,对于该模块的调用者来说,只需要知道这个模块能做什么,而不需要知道这个模块是如何做的。
总结:在模块划分时,要遵循“一个模块,一个功能”的原则,尽可能使模块达到功能内聚。
高内聚,低耦合的系统有什么好处呢?事实上,短期来看,并没有很明显的好处,甚至短期内会影响系统的开发进度,因为高内聚,低耦合的系统对开发设计人员提出了更高的要求。高内聚,低耦合的好处体现在系统持续发展的过程中,高内聚,低耦合的系统具有更好的重用性,维护性,扩展性,可以更高效的完成系统的维护开发,持续的支持业务的发展,而不会成为业务发展的障碍。

软件工程中的耦合类型相关推荐

  1. java 耦合性_软件工程中的耦合性和解耦合性是什么意思?

    我也来通俗地讲一讲,说的不好请勿喷. 简单概括:耦合就是程序中的一部分跟其他部分之间的关系.解耦合就是把必要的耦合理顺,同时尽量减少不必要的耦合(这一句其实就是高内聚低耦合的通俗解释). 如何看待耦合 ...

  2. 软件工程中的所有内聚类型【吐血整理,附带排名!】

    模块间的耦合和模块的内聚是度量模块独立性的两个准则.内聚是模块功能强度的度量,即模块内部各个元素彼此结合的紧密程度.一个模块内部各元素之间的紧密程度越高,则其内聚性越高,模块独立性越好. 一般来讲,聚 ...

  3. 浅析软件工程中的一些常见设计原则

    老子说:有道无术,术尚可求也.有术无道,止于术.如果说设计模式是"术",那么设计原则就是"道".今天,我们一起来聊聊软件工程中一些常用的设计原则. DRY 原则 ...

  4. 软件工程中的设计原理与设计模式

    软件工程课程 https://gitee.com/mengning997/se中介绍了设计原理与设计模式,本博客聚焦于设计模式,参考此课程调研整理了设计模式并分析了适用场景. 设计原理 design ...

  5. c 语言 if 多变量相等_计算机界 TOP 3 难题:“相等”是软件工程中许多重大问题的根源...

    有一个笑话说,计算机科学界有两大难题:一是缓存失效问题,二是命名问题.但我认为还有第三个更难的问题:相等问题.你没看错,等号"="看似简单,但等号的使用和误用,是软件工程中许多重大 ...

  6. 计算机界 TOP 3 难题:“相等”是软件工程中许多重大问题的根源!

    有一个笑话说,计算机科学界有两大难题:一是缓存失效问题,二是命名问题.但我认为还有第三个更难的问题:相等问题.你没看错,等号"="看似简单,但等号的使用和误用,是软件工程中许多重大 ...

  7. 复杂、繁杂、庞杂:图解七种代码耦合类型

    欢迎大家关注公众号「JAVA前线」查看更多精彩分享文章,主要包括源码分析.实际应用.架构思维.职场分享.产品思考等等,同时欢迎大家加我个人微信「java_front」一起交流学习 1 复杂.繁杂.庞杂 ...

  8. 软件工程中众包应用的综述

    A Survey of the Use of Crowdsourcing in Software Engineering 作者 摘要 1 介绍 2 背景 2.1 众包 2.2 众包软件工程 2.2.1 ...

  9. 基于在软件工程中对贝叶斯网络的循证决策

    基于在软件工程中对贝叶斯网络的循证决策 摘要:在软件工程中的推荐系统应该设计成集成依据并成为从业人员的经验.贝叶斯网络为以证据为基础的决策提供了自然统计框架,通过结合现有证据的综合概要与相关的不确定性 ...

最新文章

  1. 【OpenCV】cv::VideoCapture 多线程测试
  2. 使用Flow检查React,Redux和React-Redux的全面指南
  3. 矩阵一维卷积c++_深度神经网络卷积层计算加速与优化
  4. IDEA+scala+spark程序开发流程
  5. c语言中赋予从2开始的偶数,2013年计算机二级C语言上机试题三十二及答案
  6. 目录同步 linux,Linux系统目录实时同步
  7. 那些年困扰我们的Linux 的蠕虫、病毒和木马
  8. Eclipse的JavaWeb项目导入到IntelliJ IDEA 并且配置Tomcat
  9. Expression Blend实例中文教程(12) - 样式和模板快速入门Style,Template
  10. 34(数组). 在排序数组中查找元素的第一个和最后一个位置
  11. C# ZipArchive 文件末端错误 的解决方案
  12. mq消息队列到底是什么
  13. 宇枫资本投资理财的几大定律
  14. 美国弗吉尼亚大学计算机科学,弗吉尼亚大学计算机科学专业排名第30(2020年USNEWS美国排名)...
  15. 高科技还是“智商税”?你怎么选
  16. Python 中的多进程(进程之间的通信)
  17. QQ欢乐斗地主心得体会 (三):高倍场攻略
  18. 利用Lazy简化单例模式的编写
  19. Android TextWatcher 避免死循环
  20. 【软件测试】接口测试工具Charles之map remote setting

热门文章

  1. Blink SQL UNION ALL语句
  2. Mac下使用fiddler抓包
  3. PerfDog(性能狗)测试之FPS
  4. UserControl 中包含封装了集合对象的属性被设计器自动初始化所引起的错误!也有关于List的问题
  5. java 2d 应用_JAVA 2D的一些应用
  6. Unity 中批量修改模型材质球
  7. 会计准则中计算机软件费用摊销,财务软件累计摊销完的账务处理
  8. 终于有华为网工整理网工10大必备软件,最新软件安装包
  9. 字体大小中大写字号与小写字号对应关系
  10. 文本挖掘(四万字总结篇:爬虫 - 文本预处理 - 高频词统计 - 聚类 - 情感分析)