模块设计中的内聚和耦合
概述
好的模块设计应该是模块的实现细节对其他模块来说是隐蔽的。模块内部的细节应尽可能得私用,不被其他模块使用,模块间的通讯信息应该只包含必要信息(尽可能少)。两个准则度量模块独立性:内聚性和耦合性。
内聚性
内聚是模块功能强度的度量。一个内聚程序高的模块就当只做一件事(难点是一件事的粒度的判断标准)。内聚性的7种类型,内聚性越高、模块独立性越高、从高到低分别是:
功能内聚
一个模块中各个部分都是为完成一项具体功能而协同工作、紧密联系、不可分割的,则称该模块为功能内聚模块。功能内聚模块是内聚性最强的模块。
信息内聚
这咱模块完成多个功能,各个功能都在同一数据结构上操作,每一项功能都有一个唯一的入口点。
通信内聚
如果一个模块内各功能部分都使用了相同的输入数据,或产生了相同的输出数据,则称之为通信内聚模块。通常、通信内聚模块是通过数据流图来定义的。
过程内聚
使用流程图作为工具设计程序的时候,常常通过流程图来确定模块划分。把流程图中的某一部分划出模块,就得到过程内聚模块。
时间内聚
多功能模块,但要求模块的各个功能必须在同一时间段内执行。
逻辑内聚
这种模块把几种相关的功能组合在一起,每次被调用时,由传送给模块的控制型参数来确定该模块应执行哪一种功能。
巧合内聚(偶尔内聚)
当几个模块内凑七有一些程序段代码相同,又没有明确表现出独立的功能,把这些代码独立出来建立的模块即为巧合内聚模块。缺点是模块的内容不易理解,不易修改和维护
耦合性
耦合是模块之间的相对独立性的度量,它取决于各个模块之间接口的复杂程序、调用模块的方式及哪些信息通过接口。耦合性越低模块独立性越高,耦合性从高到低:
内容耦合
如果一个模块直接访问另一个模块的内部数据,或者一个模块不通过正常入口转到另一模块内部,或者两个模块有一部分程序代码重复,或者一个模块有多个入口,则两个模块之间就发生了内容耦合。在内容耦合的情况下,被访问模块的任何变更,或者使用不同的编译器对它再编译,都会造成程序出错。
公共耦合
若一组模块都访问同一个公共数据环境,则它们之间的耦合就称为公共耦合。公共的数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区等。
外部耦合
一组模块都访问同一全局简单变量而不是全局数据结构。
控制耦合
如果一个模块通过传送开关、标志、名字等控制信息,明显地控制选择另一个模块的功能,就是控制耦合。
标记耦合
如果一模块通过传递记录信息,就是标记耦合。事实上,这组模块共享了某一数据结果的子结构,而不是简单变量。这要求这些模块都必须清楚该记录的结构,并按结构进行操作。
数据耦合
如果一个模块访问另一个模块时,彼此之间是通过数据参数来交换输入、输出信息的,则称这种耦合为数据耦合。数据耦合是松散的耦合,模块独立性比较强。
非直接耦合
如果两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的,这就是非直接耦合。
扇入和扇出
在软件工程中,"扇入"和"扇出"是用来描述软件系统中模块之间的依赖关系的概念。
- 扇入(Fan-in):指的是一个模块被其他模块调用的次数或频率。如果一个模块被很多其他模块所调用,那么它的扇入就很高。高扇入通常表示该模块是系统中的核心模块或重要功能点,因为它被其他模块频繁地使用。
- 扇出(Fan-out):指的是一个模块调用其他模块的数量或频率。如果一个模块调用了很多其他模块,那么它的扇出就很高。高扇出可能表示模块的职责过于繁重,可能存在功能过于集中的问题,也可能导致系统的耦合性增加,使得系统难以维护和扩展。
理想情况下,我们希望模块的扇入高而扇出低,这样可以提高系统的可维护性、可扩展性和可重用性。因此,在设计和重构软件系统时,我们通常会尝试减少模块之间的耦合,控制模块的扇出,并通过模块化设计来提高系统的质量。
💬 评论 (0)
分享你的想法和见解
请 后发表评论
还没有评论,快来发表第一条评论吧!