模块内聚性的重要性及其种类解析:从偶然内聚到过程内聚
一、内聚。

内聚性用于度量一个模块内部各个组成元素相互结合的紧密程度。模块内组成元素结合紧密时,模块的内聚性就高,模块的独立性也会高。理想的内聚性要求模块的功能要明确且单一,也就是一个模块只做一件事。
内聚有如下的种类,它们之间的内聚度由弱到强排列如下:
一个模块内的各处理元素之间没有联系,只是被偶然地凑到一起。这种模块被称为巧合内聚,其内聚程度是最低的。
逻辑内聚指的是这种模块会将几种相关的功能组合在一起。每次被调用时,是通过传送给模块的参数来确定该模块应该完成哪一种功能。
在一定时间内,将需要同时执行的动作组合在一起而形成的模块,被称为时间内聚模块。
构件或操作的组合方式为,在调用前面的构件或操作之后,能够马上调用后面的构件或操作,即便两者之间没有数据传递。这就是过程内聚的一种表现形式。简单来讲,若一个模块内的处理元素是相关的,并且必须按照特定次序执行,那么就可称为过程内聚。
通信内聚指的是模块内的所有处理元素都在同一个数据结构上进行操作,或者所有的处理功能都通过公用数据而相互关联,这种情况有时也被称之为信息内聚。也就是说,模块内的各个组成部分都使用相同的数据,或者产生相同的数据结构。
顺序内聚指的是在一个模块中,各个处理元素都与同一个功能有着紧密的联系,并且这些处理必须按照先后顺序执行,通常情况下,前一个处理元素的输出会成为后一个处理元素的输入。
某模块具备完成工业产值求值的功能。其中,前一个功能元素用于求取总产值,后一个功能元素用于求取平均产值。很明显,该模块内部的这两部分是紧密关联的。
顺序内聚的内聚度比较高,但缺点是不如功能内聚易于维护。
功能内聚指的是模块内所有元素的各个组成部分都是为了完成同一个功能而存在的。它们共同完成一个单一的功能,并且模块已无法再进行划分。也就是说,模块仅仅包含了为完成某个功能所必须的所有成分,这些成分之间联系紧密,缺一不可。
功能内聚具有最强的内聚性,其优势在于功能明确。判断一个模块是否为功能内聚,通常从模块名称便可看出。若模块名称仅包含一个动词和一个特定的目标(单数名词),一般可认定为功能内聚,例如“计算水费”“计算产值”等这类模块。功能内聚通常在软件结构图的较低层级中出现。
功能内聚模块有一个重要特点。它是一个“暗盒”。对于该模块的调用者而言,只需知晓这个模块能做何事,无需了解这个模块是怎样去做的。
总结:在进行模块划分时,需遵循“一个模块,一个功能”的原则,并且要尽可能让模块实现功能内聚。
二、耦合。
软件结构内不同模块之间互连程度的一种度量叫做耦合性,也叫块间联系。它指的是软件系统结构中各模块间相互联系的紧密程度。模块之间联系越紧密,耦合性就越强,而模块的独立性就越差。模块间耦合的高低取决于模块间接口的复杂性、调用的方式以及传递的信息。
耦合的强度依赖于以下几个因素:
(1)一个模块对另一个模块的调用;
(2)一个模块向另一个模块传递的数据量;
(3)一个模块施加到另一个模块的控制的多少;
(4)模块之间接口的复杂程度。
耦合按从强到弱的顺序可分为以下几种类型:
当一个模块直接对另一个模块的数据进行修改或操作时,会发生内容耦合。当一个模块直接转入另一个模块时,也会发生内容耦合。在这种情况下,被修改的模块完全依赖于修改它的模块。
两个以上的模块共同去引用一个全局数据项,这样的情况就被称作公共耦合。
一个模块通过在界面上传递一个信号,比如开关值或者标志量等,来对另一个模块进行控制。而接收这个信号的模块,其动作会依据信号的值进行相应的调整,这种情况就被称为控制耦合。
标记耦合指的是模块间通过参数传递复杂的内部数据结构。这种情况下,若此数据结构发生变化,那么相关的模块就会随之发生变化。
模块间借助参数来传递基本类型的数据,这种情况被称作数据耦合。
(6)非直接耦合。模块间没有信息传递时,属于非直接耦合。
如果模块之间必须存在耦合,那么就应尽量采用数据耦合这种方式。同时,要减少使用控制耦合。并且要对公共耦合的范围进行限制。最后,坚决不能使用内容耦合。
总结:耦合对软件的复杂程度和设计质量有重要影响。为提升模块的独立性,需建立模块间尽可能松散的系统。在设计时应遵循以下原则:若模块间必须有耦合,应优先使用数据耦合,减少使用控制耦合,谨慎使用或有控制地使用公共耦合,并对公共耦合的范围加以限制,尽量避免内容耦合。
软件工程中有高内聚低耦合这一概念,它是判断设计好坏的标准,主要要看类的内聚性是否高,以及耦合度是否低。