功能模块
经济学术语
功能模块是指数据说明、可执行语句等程序元素的集合,它是指单独命名的可通过名字来访问的过程、函数、子程序或宏调用。功能模块化是将程序划分成若干个功能模块,每个功能模块完成了一个子功能,再把这些功能模块总起来组成一个整体。以满足所要求的整个系统的功能。
模块化依据
功能模块化的根据是,如果一个问题有多个问题组合而成,那么这个组合问题的复杂程度将大于分别考虑这个问题时的复杂程度之和。这个结论使得人们乐于利用功能模块化方法将复杂的问题分解成许多容易解决的局部问题。功能模块化方法并不等于无限制地分割软件,因为随着功能模块的增多,虽然开发单个功能模块的工作量减少了,但是设计功能模块间接口所需的工作量也将增加,而且会出现意想不到的软件缺陷。因此,只有选择合适的功能模块数目才会使整个系统的开发成本最小。
模块独立性
功能模块独立的概念是功能模块化、抽象、信息隐蔽和局部化概念的直接结果。
抽象是指对事物、状态或过程之间所存在的某些相似的方面集中和概括起来,而暂时忽略他们之间的差异,即考虑抽象事物的本质特征而暂时不考虑他们的细节。信息隐蔽是指再设计功能模块时使得一个功能模块内所包含的信息(过程或数据),对于不需要这些信息的功能模块来说是不能访问的。信息隐蔽原则对于以后在软件维护期间修改软件时会带来极大的好处,因为大量数据和过程是软件的其他部分所不能觉察的,因而再对某个功能模块修改时就不大会影响到软件的其他部分,所谓局部化是指把一些关系密切的软件元素在物理位置上彼此靠近。
功能模块独立性是通过制定具有单一功能并且和其他功能模块没有过多联系的功能模块来实现的。每个功能模块只涉及该软件要求的一个具体子功能,而且与软件结构的其他部分的接口是简单的。
功能模块独立性好的软件接口简单,易于编制,独立的功能模块也比较容易测试和维护,限制了功能模块之间由于联系紧密而引起的修改副作用。独立性是保证软件质量的重要因素。
独立性度量
功能模块独立性是由内聚性耦合性两个定性指标来度量的。内聚性是度量一个功能模块内功能强度的一个相对指标。耦合性则用来度量功能模块之间的相互联系的程度。
耦合
耦合是软件结构中各功能模块之间相互连接的一种度量,耦合强弱取决于功能模块间接口的复杂程度、进入或访问一个功能模块的点以及通过接口的数据。
耦合有以下几种,他们之间的耦合度由高到低排列:
☆内容耦合。如一个功能模块直接访问另一个功能模块的内容,则这两个功能模块称为内容耦合。
公共耦合。如一组功能模块都访问统一全局数据结构,则称之为公共耦合。
☆外部耦合。如一组功能模块都访问统一全局数据项,则称之为外部耦合。
控制耦合。如一功能模块明显地把开关量、名字等信息送入另一功能模块,控制另一功能模块的功能,则为控制耦合。
标记耦合。如一组功能模块共享了某个记录,而不是简单变量,即这些功能模块都需某一数据的子结构时,就需要按该记录的结构进行操作,并通过参数表来传递记录信息,这样的耦合称之为标记耦合。
数据耦合。如一个功能模块访问另一个功能模块,被访问的功能模块的输入和输出都是数据项参数,则这两个功能模块为数据耦合。
☆非直接耦合。若两个功能模块没有直接关系,他们之间的联系完全是通过主程序的控制和调用来实现的,便称这两个功能模块为非直接耦合,独立性最强。
上面只是对耦合机制进行了一个分类。原则上讲,功能模块化设计总是希望功能模块之间的耦合表现为非直接耦合方式。但是,由于问题所固有的复杂性和空间方面的考虑,有时则要根据实际情况,全面权衡,选用其它类型的耦合。
内聚
内聚是从功能角度来度量功能模块内的联系,一个好的内聚功能模块应当恰好做一件事。它描述的是功能模块内的功能联系。
内聚有如下的种类,其内聚度由弱到强排列:
☆偶然内聚。一功能模块中的代码无法定义其不同功能的调用。但它使该功能模块能执行不同的功能,这种功能模块称为巧合强度功能模块。
逻辑内聚。这种功能模块把几种相关的功能组合在一起,每次被调用时,有传送给功能模块参数来确定该功能模块应完成那一种功能。
☆时间内聚。这种功能模块顺序完成一类相关功能,比如初始化功能模块,它顺序为变量置初值。
过程内聚。如果一个功能模块内的处理元素是相关的,而且必须以特定次序执行则称为过程内聚。
☆通信内聚。这种功能模块除了具有过程内聚的特点外,还有另外一种关系,则它的所有功能都通过使用公共数据而发生关系。
顺序内聚。如果一个功能模块内的处理元素和同一个功能密切相关,而且这些处理必须顺序执行,通常一个处理元素的输出数据作为下一个处理元素的输入数据,则称为顺序内聚。
功能内聚。如果一个功能模块包括并仅包括未完成某一具体任务所必需的所有成分,或者说功能模块中所有成分结合起来是为了完成一个具体的任务,此功能模块称为功能强度模块。
软件功能模块指标
系统中的各功能模块在纳入时间、激活机制和控制方式等方面可以不相同。
1)纳入时间
纳入时间是指一个功能模块被归并到软件的源语言描述之中的时间。比如宏功能模块是由编译器把它作为程序的一部分直接插入到引用位置上去的。而普通的子程序则是通过产生目标代码与连接代码而纳入到软件中的。
2)激活机制
功能模块的激活机制通常有两种:一个是通过引用来调用功能模块,另一个是通过中断来调用一个功能模块。在实时系统中,通常使用后者。比如,使用一个外部时间来引起处理过程的中断,然后使控制转到另一个功能模块。
3)控制方式
一般功能模块具有单一入口和单一出口,并作为程序的一部分顺序地执行,有时,也需要更为复杂的控制方式,如可重入功能模块。这种功能模块不以任何方式修改它自己或它所访问的局部地址,从而这样的功能模块就可以同时被几个任务使用。
4)结构分类
软件结构中,功能模块可以分为以下几类:
顺序功能模块:它在没有明显中断情况下被应用软件调用和执行。
增量功能模块:它在调用结束之前可以被应用程序中断,然后在中断点重新启动。
并行功能模块:它在并行多处理机环境中与别的功能模块同时执行。
设计要素
1.提高功能模块独立性
在得到软件结构之后,就应首先着眼于改善功能模块的独立性,考验是否应该把一些功能模块提取或合并,力求降低耦合提高内聚。例如,多个功能模块共有的一个子功能可以独立成一个功能模块,由这些功能模块调用,有时可以通过分解或合并功能模块以减少控制信息的传递及对全局数据的引用,并且降低接口的复杂度。
2.功能模块规模适度
经验表明,当功能模块过大时,功能模块的可理解性就会迅速下降。但是对过大的功能模块分解时,也不应降低功能模块的独立性。因为当对一个大的功能模块分解时,有可能增加功能模块之间的依赖。
3.深度、宽度、扇出扇入要适当
如果深度过大则说明有的控制模块可能简单了。如果宽度过大则说明系统的控制过于集中。而扇出过大则意味着功能模块过于复杂,需要控制和协调过多的下级模块,这时应适当地增加中间层次,扇出太小则可以把下级模块进一步分解成若干个子功能模块,或者合并到上级功能模块中去。一个功能模块的扇入是表明有多少个上级功能模块直接调用它,扇入越大则共享该模块的上级模块数目越多,这是有好处的。
4.要使模块的作用范围保持在该模块的控制范围内
功能模块的作用范围是指受该功能模块内一个判定影响的所有功能模块的集合。功能模块的控制范围是指这个功能模块本身以及所有直接或间接从属于它的功能模块的集合。在一个设计得很好的系统中,所有受判定影响的功能模块应该都从属于作出判定的那个功能模块,最好局限于做出判定的那个功能模块本身及它的直接下级模块。对于那些不满足这一条件的软件结构修改的办法是:将判定点上移或者将那些在作用范围内但是不在控制范围内的功能模块移植到控制范围内。
5.应减少功能模块的接口的复杂性和冗余度,并改善一致性
功能模块接口复杂是软件发生错误的一个主要原因。应该仔细设计模块接口,使得信息传递简单并且和模块的功能一致。
6.设计成单入口、单出口的功能模块,避免病态连接
要防止内容耦合性,如果功能模块都是从顶部入口、从底部出口的话,这样的软件也更易于理解和易于维护。病态连接关系是指从中部进入或访问一个模块。
7.模块的功能可预测
如果一个功能模块可以当做一个黑箱,即只要输入的数据相同就产生同样的输出,这个模块的功能就是可以预测的。而那些具有内部记忆的功能模块则可能是不可预知的,因为它可能记载了某个内部标志并且利用这个标志去选择处理方案。由于这个标志对上级功能模块来说是看不见的,因而可能引起混乱。
8.组装软件根据设计的约束和移植的需要
组装是指用来把软件组合起来,以便把软件放入特定的处理环境或送往其他的地方。有时,设计约束要求一个程序要在内存中覆盖自己。如果有这种要求的话,原设计结构就可能必须重新组织以便按照重复的次数、存取的频率以及各次调用之间的间隔来把功能模块组合起来。
参考资料
最新修订时间:2022-08-25 18:48
目录
概述
模块化依据
模块独立性
参考资料