高内聚、低耦合的定义:
内聚:每个模块尽可能独立完成自己的功能,不依赖于模块外部的代码。
耦合:模块与模块之间接口的复杂程度,模块之间联系越复杂耦合度越高,牵一发而动全身。
目的:使得模块的“可重用性”、“移植性”大大增强
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
内聚
内聚是从功能角度来度量模块内的联系,一个好的内聚模块应当恰好做一件事,它描述的是模块内部的功能联系。
内聚性:
称块内联系,指模块的功能强度的度量,系一个模块内部各个元素彼此间结合的紧密程度的度量。
若一个模块内各个元素联系的越紧密,它的内聚性就越高。
高内聚:
指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一职责原则。内聚分类:↓
①偶然内聚
一个模块内的各处理元素之间没有任何联系,只是偶然地被凑到一起。这种模块也称为巧合内聚,内聚程度最低。
②逻辑内聚
把几种相关的功能组合在一起, 每次被调用时,由传送给模块参数来确定该模块应完成哪一种功能 。
③时间内聚
把需要同时执行的动作组合在一起形成的模块称为时间内聚模块。
④过程内聚
简单的说就是如果一个模块内的处理元素是相关的,而且必须以特定次序执行则称为过程内聚。
⑤通信内聚
即指模块内各个组成部分都使用相同的数据据结构或产生相同的数据结构。有时称之为信息内聚。
⑥顺序内聚
一个模块中各个处理元素和同一个功能密切相关,而且这些处理必须顺序执行,通常前一个处理元素的输出时后一个处理元素的输入。
⑦功能内聚
即模块仅包括为完成某个功能所必须的所有成分,这些成分紧密联系、缺一不可。
最强的内聚。
内聚总结:
在模块划分时,要遵循“一个模块,一个功能”的原则,尽可能使模块达到功能内聚。
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
耦合
耦合是软件结构中各个模块之间相互连接的一种度量,耦合强弱取决于模块间接口的复杂程度、进入或访问一个模块的点以及通过接口的数据。
耦合性:
称块间联系,指软件系统结构中各个模块间相互联系机密程度的一种度量。
模块间的联系越紧密耦合度就越高,模块的独立性也就越差。
模块间耦合度的高低取决于模块间接口的复杂性、调用的方式、传递的信息。
低耦合:
简单理解,一个完整的系统,模块与模块之间,尽可能的使其独立存在。
让每一个模块尽可能独立完成某个特定的子功能。
模块之间的接口应该尽量少而简单。
耦合分类:↑
①内容耦合
一个模块直接访问另一模块的内容,则称这两个模块为内容耦合。
②公共耦合
一组模块都访问同一个全局数据结构,则称之为公共耦合。
③外部耦合
一组模块都访问同一全局简单变量,而且不通过参数表传递该全局变量的信息,则称之为外部耦合。
④控制耦合
模块之间传递的不是数据信息,而是控制信息例如标志、开关量等,一个模块控制了另一个模块的功能。
⑤标记耦合
调用模块和被调用模块之间传递数据结构而不是简单数据,同时也称作特征耦合。
⑥数据耦合
调用模块和被调用模块之间只传递简单的数据项参数。相当于高级语言中的值传递。
⑦非直接耦合
两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的。耦合度最弱,模块独立性最强。
耦合总结,模块间不可避免会出现耦合,但应该遵循:
①尽量使用数据耦合;
②减少控制耦合;
③慎用或有控制的使用公共耦合,并限制公共耦合的范围;
④尽量避免内容耦合。
通常程序结构中各模块的内聚程度越高,模块间的耦合程度就越低
对于函数来说:
高内聚:尽可能类的每个成员方法只完成一件事(最大限度的聚合)
低耦合:减少类内部,一个成员方法调用另一个成员方法
对于类来说:
高内聚低耦合:减少类内部,对其他类的调用
对于功能块来说:
高内聚低耦合:减少模块之间的交互复杂度(接口数量,参数数据)
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
耦合的划分,它们之间的耦合度由高到低排列如下:
(1) 内容耦合:一个模块直接访问另一模块的内容,则称这两个模块为内容耦合。
若在程序中出现下列情况之一,则说明两个模块之间发生了内容耦合:
-
一个模块直接访问另一个模块的内部数据。
-
一个模块不通过正常入口而直接转入到另一个模块的内部。
-
两个模块有一部分代码重叠(该部分代码具有一定的独立功能)。
-
一个模块有多个入口。
内容耦合可能在汇编语言中出现。大多数高级语言都已设计成不允许出现内容耦合。这种耦合的耦合性最强,模块独立性最弱。
(2) 公共耦合:一组模块都访问同一个全局数据结构,则称之为公共耦合。公共数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区等。如果模块只是向公共数据环境输入数据,或是只从公共数据环境取出数据,这属于比较松散的公共耦合;如果模块既向公共数据环境输入数据又从公共数据环境取出数据,这属于较紧密的公共耦合。
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
耦合带来的问题:
代码可维护性差、理解性差、新增功能模块繁琐。
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------
高内聚低耦合的优势:
事实上,短期来看,并没有很明显的好处,甚至短期内会影响系统的开发进度,因为高内聚,低耦合的系统对开发设计人员提出了更高的要求。高内聚,低耦合的好处体现在系统持续发展的过程中,高内聚,低耦合的系统具有更好的重用性,维护性,扩展性,可以更高效的完成系统的维护开发,持续的支持业务的发展,而不会成为业务发展的障碍。