耦合是什么意思(什么是内聚和耦合?)
在软件设计中应该保持模块的独立性原则。反映模块独立性有两个标准:内聚和耦合。内聚衡量一个模块内部各个元素彼此结合的紧密程度,耦合衡量模块之间彼此依赖的程度。
耦合
耦合是指模块间相互关联的程度。模块间的关联程度取决于下面几点:
一个模块对另一个模块的访问。比如,模块A可能要调用模块B来完成一个功能,所以说模块A要依赖于模块B完成它的功能。
模块间传递的数据量。
一个模块传递给另一个模块的控制信息。
模块间接口的复杂程度。
根据这几点可将耦合分为7类:
内容耦合:
如果一个模块直接引用另一个模块的内容,则这两个模块是内容耦合。
公共耦合:
如果多个模块都访问同一个公共数据环境,则称它们是公共耦合。公共数据环境可以是全局数据结构、共享的通信区、内存的公共网覆盖区等。由于多个模块共享同一个公共数据环境,如果其中一个模块对数据进行了修改,则会影响到所有相关模块。
外部耦合:
如果两个模块都访问同一个全局简单变量而不是同一全局数据结构,则这两个模块属于外部耦合。
控制耦合:
如果模块A向模块B传递一个控制信息,则称这两个模块是控制耦合的。例如,把一个函数名作为参数传递给另一个模块时,实际上就控制了另一个模块的执行逻辑。控制耦合的主要问题是两个模块不是相互独立的,调用模块必须知道被调用模块的内部结构和逻辑,这样就不符合信息隐藏和抽象的设计原则,并且也降低了模块的可重用性。
数据结构耦合:
当一个模块调用另一个模块时传递了整个数据结构,那么这两个模块之间具有数据结构耦合。
数据耦合:
如果两个模块传递的是数据项,则这两个模块是数据耦合。
非直接耦合:
如果两个模块之间没有直接关系,它们之间的联系完全通过主模块的控制和调用来实现,这就是非直接耦合。
上面的几种耦合中,内容耦合是模块间最紧密的耦合,非直接耦合是模块间最松散的耦合。软件设计的目标是降低模块间的耦合程度,设计时应该采取这样的设计原则:尽量使用数据耦合,少用控制耦合,限制公共耦合,坚决不用内容耦合。
内聚
内聚是指一个模块内部各元素之间关系的紧密程度。内聚分为7种类型。下面分别讨论各种内聚的含义及其对软件独立性的影响。
巧合内聚:
一个模块执行多个完全互不相关的动作,那么这个模块就有巧合内聚。
逻辑内聚:
当一个模块执行一系列相关的动作时,称其有逻辑内聚。例如,一个模块执行对主文件的插入、删除和修改操作。一般逻辑内聚的模块含有太多的相关功能,一个模块含有较多的功能时,模块的入口参数一定比较多,通常是根据入口参数决定执行模块中的哪个功能。所以,网逻辑内聚模块带来两个问题:一个是接口参数复杂,难于理解;另一个是多个功能纠缠在一起,使得模块的可维护性降低。
时间内聚:
当一个模块内的多个任务与时间有关时,这个模块具有时间内聚。最常见的时间内聚模块是初始化模块,在这个模块中的动作之间,除了时间上需要在系统初启时完成之外,没有其他网的关系。
过程内聚:
模块执行的若干动作之间相互关联并且有顺序关系。例如,从录入界面读取数据,然后更新数据库记录。它仍然是将多个相关的功能放在一个模块中实现。
通讯内聚:
模块中所有元素都使用同一个输入数据或产生同一个输出数据。
顺序内聚:
如果一个模块中的处理元素和同一个功能密切相关,并且这些处理必须是顺序执行的,那么这个模块具有顺序内聚。
功能内聚:
一个模块中各个部分都是完成某一具体功能必不可少的组成部分。这些部分相互协调工作,紧密联系,不可分割,目的是完成一个完整的功能。具有功能内聚的模块是最理想的模块,这种模块易于理解和维护,并且它的可重用性好。
上述7种内聚中,功能内聚模块的独立性最强,巧合内聚模块的独立性最弱。在设计时应该尽可能保证模块具有功能内聚。