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