20世纪60、70年代,软件系统的规模越来越大,复杂度越来越高,软件危机爆发,软件工程应运而生。如何合理有效的度量复杂度并加以控制,成为科研人员探索的主题。1976年McCabe提出并开发了McCabe Cyclomatic Metric,对软件进行结构测试。1977年Halstead提出软件标准。这两种方法是复杂度度量的开始。
1976年McCabe提出圈复杂度,从提出至今,四十余年的发展中,圈复杂度在工业界和学术界都备受重视,学术界仍在有研究圈复杂度的文章,工业界中,度量软件复杂度的主流方法仍然是圈复杂度。
圈复杂度的现状
在阅读了关于圈复杂度2010年至今的文章,圈复杂度的文章可以分为几大类,一则结合圈复杂度本身图论的性质,例如用作UML图可理解度的度量,二是,作为众多复杂度度量方法之一,用作软件指标的测量,探究对软件属性的影响。
近几年对于圈复杂度方法改进的的文章少见,一方面,圈复杂度作为一个成熟的方法,很难再有突破,另一方面,学术界对圈复杂度颇有微词。
圈复杂度仅仅考虑了软件的设计结构,并未考虑的软件的输入、输出,这是一种不全面的计算方式。圈复杂度于1976年提出,此时,面向对象编程语言尚未出现,而今,面向方法早已占据了编程语言的半壁江山,此时的圈复杂度方法是否仍然适用,是一个有待探讨的问题。
针对面向对象语言的度量方法也有诸多,但是技术或者是理论的限制,这些方法并没有被工业界广泛应用,以至于工业界目前所知道的、使用的额,仍然是圈复杂度。
认知复杂度的兴起
2000年后,认知信息学,突飞猛进,这种新的理论方法,逐渐被应用到软件工程领域,以wang为代表的研究者,提出软件是一个信息实体,理解信息的复杂度即代表着软件难于理解的复杂度,这一思想,成为之后软工领域提出、改进认知复杂度方法的基础。
2002年wang提出了认知功能规模(Cognitive
Functional Size, CFS),认知复杂度的方法首次被提出,在此之后的方法都是基于CFS改进的,包括CICM、MCCM、CPCM等。Wang在CFS的论文中,总结了基础控制结构(Basic Control Structure,BCS),基础控制结构是构建软件逻辑体系结构的基本流程结构,wang通过心理实验的方法,为每一种结构分配认知权重,例如顺序的结构的权重是1,分支结构的权重是3,数字越大,即代表着理解结构越困难。
复杂度度量方法的验证
复杂度方法的验证,目前多是通过1988年weyuker提出的9种属性的验证,这种方法只能从宏观上描述一个度量方法是否有效:譬如度量两个不同的程序,值是否不同。定性的度量方法只解决了可不可以用的问题,是否可靠的问题尚未解决。验证薄弱,论文还会通过对比和专家经验,对比方法即将提出的方法与已有的方法纵向对比,主要比较的属性是对于不同的程序的区分度,不同语言的适用性。专家经验一般专用于验证认知复杂度的方法,对比认知方法度量的值和专家的评价值,若保持一致,即认为提出的方法更有效。
阈值的设定
引入复杂度度量方法,是希求能定量的计算出程序或软件的复杂度,从而提醒开发人员,重构代码,控制复杂度。便需要复杂度阈值的概念,即复杂度超过某个值需要控制复杂度,在哪个区间范围时合理的。一般来说,不同的度量方法,针对不同的语言,会有不同的阈值。McCabe&Associates公司曾建议圈复杂度的阈值要控制在10以下。此阈值没有针对不同的语言,也没有说明所度量程序或者是软件的大小。这个阈值在工业界已经稍有使用,工业界目前对于何时控制一般采取经验值,或者不做控制。
复杂度的意义
复杂度是否有意义,这个问题的答案实则等价于问,软件工程是否有意义,软件的不可见性,复杂,以及人为决定了软件是一个不可控极为矛盾的实体,复杂度方法所能做的,尽可能准确、客观指导开发人员控制软件的复杂度。从人的角度来看,软件复杂度是难以理解、难以维护的程度;从软件的生命周期来看,复杂度是软件设计、实现、维护和改变的难度;从软件本身开看,复杂度是软件的固有静态属性。
软件复杂度度量方法是否有意义,软件复杂度本身研究是否有意义,也许要从软件工程发展历史之路来看,但凡能有所作用的、有所改善的,都是必要的。
网友评论