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