耦合(Coupling)和内聚(Cohesion)是衡量模块设计质量的两个非常重要的概念。耦合描述了一个模块与其他模块之间的依赖关系强度,内聚则描述了模块内部各个部分之间的关联程度。
软件开发应向“低耦合高内聚”靠拢,理想的软件设计应该追求低耦合和高内聚。低耦合可以使模块更独立、更易于修改和维护。
高内聚则确保模块内部逻辑清晰、专注,更易于理解和复用。
本文主要介绍软件设计中的模块的七个内聚等级。
关于模块之间的耦合内容的介绍,请参考:软件设计中七个耦合等级的说明
一、偶然内聚
偶然内聚(Coincidental Cohesion): 也称为“巧合内聚”,是模块内聚性的一种最低形式。在偶然内聚的模块中,各个元素之间几乎没有明显的逻辑关系或功能关联,它们只是被偶然地组合在一起。这种模块通常包含一些看似无关的功能或代码片段,仅仅是因为它们在某些情况下需要一起执行。
博文详解:理解“偶然内聚”
二、逻辑内聚
逻辑内聚是指在一个模块中,各个功能虽然执行不同的操作,但它们基于某种逻辑条件或参数来决定具体执行哪个操作。也就是说,模块中的不同功能通过某些逻辑判断(如传入的参数或控制标志)来选择执行哪一部分代码。
尽管逻辑内聚比偶然内聚(Coincidental Cohesion)要好一些,但它仍然不是理想的内聚形式。这是因为模块内部的功能虽然有一定的逻辑联系,但这些功能并不紧密相关,通常只是因为它们共享了某些输入或控制条件而被组合在一起。
博文详解:理解“逻辑内聚”
三、时间内聚
时间内聚是指模块中的各个功能由于需要在同一时间段内执行而被组合在一起。这种内聚形式通常出现在初始化、清理或定时任务的场景中,其中多个操作可能没有直接的逻辑关系,但它们需要在特定的时间点或时间段内完成。
尽管时间内聚比偶然内聚(Coincidental Cohesion)要好一些,但它仍然不是理想的内聚形式。这是因为模块内部的功能虽然有一定的执行时间上的联系,但这些功能并不紧密相关,通常只是因为它们需要在同一时间段内完成而被组合在一起。
博文详解:理解“时间内聚”
四、过程内聚
过程内聚是指在一个模块中,各个功能按照某种过程或步骤执行,即它们一起完成一系列相关的操作。这意味着模块内部的每个操作都有一定的顺序性,并且这些操作通常是为了完成一个特定的任务。尽管过程内聚比偶然内聚(Coincidental Cohesion)要好一些,但它仍然不是理想的内聚形式。这是因为模块内部的功能虽然有一定的执行顺序上的联系,但这些功能并不总是紧密相关。
博文详解:理解“过程内聚”
五、通信内聚
通信内聚是指在一个模块中,所有操作都使用相同的输入数据或产生相同的输出数据。这意味着模块内部的所有功能紧密依赖于共同的数据集进行处理。这种类型的内聚通常出现在需要对同一组数据执行多种相关操作的场景中。尽管通信内聚比偶然内聚和逻辑内聚要好一些,但它仍然不是最高级别的内聚形式,因为它可能包含的功能并不总是直接相关的。
博文详解:理解“通信内聚”
六、顺序内聚
顺序内聚是指在一个模块中,各个功能按照一定的顺序执行,并且每个操作的输出直接作为下一个操作的输入。这意味着模块内部的操作是紧密相连的,形成了一条连续的数据处理链。顺序内聚是一种较强的内聚形式,因为它确保了模块内的所有操作都直接相关并且相互依赖。
博文详解:理解“顺序内聚”
七、功能内聚
功能内聚(Functional Cohesion)是最高级别的内聚形式,指的是模块内的所有元素都紧密地围绕着一个单一的功能或任务进行设计。这意味着模块的所有组成部分都是为了完成这个特定的任务而存在的,并且这些部分之间具有非常强的逻辑关联性。功能内聚的模块通常是最小化、最专注的,易于理解、维护和重用。
博文详解:理解“功能内聚”
总结对比
内聚类型 | 描述 | 示例 |
偶然内聚 | 模块中的功能几乎没有逻辑联系。 | 一个类同时负责发送邮件和记录日志。 |
逻辑内聚 | 模块中的功能基于某种逻辑条件选择执行哪个操作。 | 一个类根据输入参数选择执行不同的算法。 |
时间内聚 | 模块中的功能需要在同一时间段内执行。 | 一个类同时初始化多个对象。 |
过程内聚 | 模块中的功能按照一定的顺序执行,但不一定紧密相关。 | 一个类依次验证用户输入、创建账户、发送确认邮件。 |
通信内聚 | 模块中的功能共享相同的数据输入或输出。 | 一个类同时计算订单总价、应用折扣、生成订单摘要,共享订单数据。 |
顺序内聚 | 模块中的功能按顺序执行,并且前一个功能的输出作为下一个功能的输入。 | 一个类依次计算订单总价、应用折扣、生成订单摘要,每步依赖前一步的结果。 |
功能内聚 | 模块中的所有功能都紧密相关,共同实现一个单一的功能或目标。 | 一个类专门负责处理用户的登录请求。 |