老师成天念叨的“高内聚,低耦合”究竟是啥?
软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准,模块的内聚性和耦合性是两个相互对立且又密切相关的概念,划分模块的一个准则就是“高内聚,低耦合”。
l 内聚性
又称块内联系。
指模块的功能强度的度量,即一个模块内部各个元素彼此结合的紧密程度的度量。
l 特性
内聚性是对一个模块内部各个组成元素之间相互结合的紧密程度的度量指标。
模块中组成元素结合的越紧密,模块的内聚性就越高,模块的独立性也就越高。
理想的内聚性要求模块的功能应明确、单一,即一个模块只做一件事。
常见的内聚有七类(内聚强度从低到高)
1) 偶然内聚
如果一个模块的各成分之间毫无关系,则称为偶然内聚,也就是说模块完成一组任务,这些任务之间的关系松散,实际上没什么联系。
2) 逻辑内聚
几个逻辑上相关的功能被放在同一个模块中,则称为逻辑内聚,如一个模块读取各种不同类型外设的输入。尽管逻辑内聚比偶然内聚合理一些,但逻辑内聚的模块各成分在功能上并无关系,即使局部功能的修改有时也会影响全局,因此这类模块的修改也比较困难。
3) 时间内聚
如果一个模块完成的功能必须在同一时间内执行(如系统初始化),但这些功能只是因为时间因素关联在一起,则称为时间内聚。
4) 过程内聚
构件或者操作的组合方式是,允许在调用前面的构件或操作之后,马上调用后面的构件或操作,即使两者之间没有数据进行传递。模块完成多个需要按一定的步骤一次完成的功能。
5) 通信内聚
如果一个模块的所有成分都操作同意数据集或生成同一数据集,则称为通信内聚。
6) 顺序内聚
如果一个模块的各个成分和同一个功能密切相关,而且一个成分的输出作为另一个成分的输入,则称为顺序内聚。
7) 功能内聚
如果每一个模块的各个成分和同一个功能密切相关,则称为功能内聚。
l 耦合性
也叫耦合度,是对模块间关联程度的度量。
耦合的强弱取决于模块间接口的复杂性、调用模块的方式以及通过界面传送数据的多少。
l 特性
模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、数据传递关系。
模块间联系越多,其耦合性越强,同时表明其独立性越差。
耦合性可以是高耦合性也可以低耦合性,以下列出一些耦合性的分类
1) 内容耦合(耦合度最高)
也称为病态耦合,当一个模块直接使用另一个模块的内部数据,或通过非正常入口而转入另一个模块内部。
2) 共享耦合/公共耦合
指通过一个公共数据环境相互作用的那些模块间的耦合,公共耦合的复杂程度随耦合模块的个数增加而增加。
3) 外部耦合
发生在两个模块共享一个外加的数据格式、通信协议或是设备界面,基本上和模块和外部工具及设备的沟通有关。
4) 控制耦合
指一个模块调用另一个模块时,传递的是控制变量,被调模块通过该控制变量的值有选择地执行块内某一功能。
5) 特征耦合/标记耦合
指几个模块共享一个复杂的数据结构,如高级语言中的数组名、记录名、文件名等这些名字即标记,其实传递的是这个数据结构的地址。
6) 数据耦合
指模块借由传入值共享数据,每一个数据都是最基本的数据,而且只分享这些数据。
7) 消息耦合
可以借由以下两个方式达成:状态的去中心化,组件间利用传入值或消息传递来通信。
8) 无耦合:模块完全不和其他模块交换信息。
l 缺点
紧密耦合的系统在开发阶段有以下特点:
1. 一个模块的修改会产生涟漪效应,其他模块会随之修改。
2. 由于模块之间的相依性,模块的组合会需要更多的精力及时间。
3. 由于一个模块有许多的相依模块,模块的可复用性低。