分享
分享赚钱 收藏 举报 版权申诉 / 10

类型程序复杂性度量.doc

  • 上传人:buyk185
  • 文档编号:5839831
  • 上传时间:2019-03-19
  • 格式:DOC
  • 页数:10
  • 大小:38.50KB
  • 配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    程序复杂性度量.doc
    资源描述:

    1、程序复杂性度量程序复杂性主要指模块内程序的复杂性。它直接关联到软件开发费用的多少,开发周期的长短和软件内部潜伏错误的多少。同时 它也是软件可理解性的另一种度量。减少程序复杂性,可提高软件的 简单性和可理解性,并使软件开发费用减少,开发周期缩短,软件内部潜藏错误减少一、代码行度量法度量程序的复杂性,最简单的方法就是 统计程序的源代码行数。此方法基于两个前提:(1) 程序复杂性随着程序规模的增加不均衡地增长;(2) 控制程序规模的方法最好是采用分而治之的办法。将一个大程序分解成若干个简单的可理解的程序段。方法的基本考虑是统计一个程序模块的源代码行数目,并以源代码行数做为程序复杂性的度量。若设每行代

    2、码的出错率为每 100 行源程序中可能有的错误数目, 例如每行代码的出错率为 1, 则是指每 100 行源程序中可能有一个错误。Thayer 曾指出,程序出错率的估算范围是从 0.04 7之间,即每 100 行源程序中可能存在 0.047 个错误。他还指出,每行代码的出错率与源程序行数之间不存在简单的线性关系。Lipow 进一步指出,对于小程序,每行代码的出错率为1.31.8;对于大程序,每行代码的出错率增加到2.73.2之间,但这只是考虑了程序的可执行部分,没有包括程序中的说明部分。Lipow 及其他研究者得出一个结论:对于少于 100 个语句的小程序,源代码行数与出错率是线性相关的。随着程

    3、序的增大,出错率以非线性方式增长。所以,代码行度量法只是一个简单的,估计得很粗糙的方法。二、McCabe 度量法McCabe 度量法是一种基于程序控制流的复 杂性度量方法。McCabe 定 义的程序复杂性度量值又称环路复杂度,它基于一个程序模块的程序图中环路的个数。如果把程序流程图中每个处理符号都退化成一个结点,原来联结不同处理符号的流线变成连接不同结点的有向弧,这样得到的有向图就叫做程序图。计 算有向图 G 的环路复杂性的公式:V(G)mn2其中,V(G)是有向图 G 中的环路个数 ,m 是图 G 中有向弧个数 ,n 是图 G 中结点个数。以图 9-5-1 为 例,其中,结点数 n11,弧数

    4、 m12,则有V(G)mn2121123。即 McCabe 环路复杂度度量值为 3 。它也可以看做由程序图中的有向弧所封闭的区域个数。图 9-5-1 程序图的例子当分支或循环的数目增加时,程序中的 环路也随之增加,因此 McCabe 环路复杂度度量值实际上是为软件测试的难易程度提供了一个定量度量的方法,同时也间接地表示了软件的可靠性。实验表明,源程序中存在的错误数以及为了诊断和纠正这些错误所需的时间与 McCabe 环路复杂度度量值有明显的关系。Myers 建议 ,对于复合判定,例如(A0)(CD)(XA )算做三个判定。利用 McCabe 环路复杂度度量 时,有几点说明。环路复杂度取决于程序

    5、控制结构的复杂度。当程序的分支数目或循环数目增加时其复杂度也增加 。环路复杂度 与程序中覆盖的路径条数有关。环路复杂度是可加的。例如,模 块 A 的复杂度为 3 ,模块 B 的复杂度为 4,则模块 A 与模块 B 的复杂度是 7。McCabe 建议,对于复杂度超 过 10 的程序,应分成几个小程序,以减少程序中的错误 。Walsh 用实例证实了这个建议的正确性 。他发现,在 McCabe 复杂度为 10 的附近,存在出错率的间断跃变。McCabe 环路复杂度隐含的前提是: 错误与程序的判定加上例行子程序的调用数目成正比。而加工复杂性、数据结构、录入与打乱输入卡片的错误可以忽略不计。三、Hals

    6、tead 的软件科学Halstead 软件科学研究确定计算机软件开发中的一些定量规律,它采用以下一组基本的度量值,这些度量值通常在程序产生之后得出,或者在设计完成之后估算出。1.程序长度,即预测的 Halstead 长度令 n1 表示程序中不同运算符(包括保留字)的个数,令 n2表示程序中不同运算对象的个数,令 H 表示“程序长度”,则有Hn1log2n1 +n2log2n2这里,H 是程序 长度的预测值,它不等于程序中 语句个数。在定义中,运算符包括:算术运算符 赋值符(或:) 数组操作符逻辑运算符 分界符(,或;或:) 子程序调用符关系运算符 括号运算符 循环操作符等特别地,成对的运算符,

    7、例如“ BEGINEND ”、“ FORTO ”、“REPEATUNTIL”、“WHILEDO”、“IFTHENELSE”、“()”等都当做单一运算符。运算对象包括变量名和常数。2.实际的 Halstead 长度设 N1 为程序中实际出现的运算符总个数,N2 为程序中实际出现的运算对象总个数,N 为实际的 Halstead 长度,则有NN1+N23.程序的词汇表Halstead 定义程序的词汇表为不同的运算符种类数和不同的运算对象种类数的总和。若令 n 为程序的词汇表,则有nn1+n2图 9-5-2 是用 FORTRAN 语言写出的交换排序的例子。图 9-5-2 一个交换排序程序的例子因此有:

    8、预测的词汇量Hn1log2n1+n2log2n2 10log210+7log27 52.87实际 的词汇量 NN1+N2 28+2250程序的词汇表 nn1+n210+7 174.程序量 V程序量 V,可用下式算得V(N1+N2) log2(n1+n2)它表明了程序在“词汇上的复 杂性”。其最小 值为V*(2+n2*) log2(2+n2*)这 里, 2 表明程序中至少有两个运算符: 赋值符“:”和函数调用符“f()”,n2*表示输入输出变量个数。对于图 9-5-2的例子,利用 n1,N1,n2,N2,可以计算得:V(28+22) log2(10+7)204等效的汇编语言程序的 V328。这说

    9、明汇编语言比FORTRAN 语言需要更多的信息量(以 bit 表示)。5.程序量比率(语言的抽象级别)LV*V 或 L(2 n1)(n2N2)这里,N2n2 log2n2。它表明了一个程序的最 紧凑形式的程序量与实际程序量之比,反映了程序的效率。其倒数:D1L表明了实现算法的困难程度。有 时,用 L 表达语言的抽象级别,即用 L 衡量在表达程序过程时的抽象程度。对于高级语言 ,它接近于 1,对于低级语言,它在 01 之间。下面列出的是根据经验得出的一些常用语言的语言抽象级别。语言 L 的平均值English Prose(英语散文) 2.16 PL/1ALGOL68 FORTRANAssembl

    10、er(汇编语言)1.532.121.140.886.程序员工作量EVL7.程序的潜在错误Halstead 度量可以用来预测程序中的错误。 认为程序中可能存在的差错应与程序的容量成正比。因而预测公式为B(N1+N2) log2(n1+n2)3000 V 3000B 表示 该程序的 错误数。例如 ,一个程序对 75 个数据库项共访问 1300 次,对 150 个运算符共使用了 1200 次,那么预测该程序的错误数:B(1300+1200)log2(75+150)30006.5即 预测该程序中可能包含 6 7 个错误。Halstead 的重要结论之一是:程序的实际 Halstead 长度 N可以由词

    11、汇表 n 算出 。即使程序还未编制完成,也能预先算出程序的实际 Halstead 长度 N, 虽然它没有明确指出程序中到底有多少个语句。这个结论非常有用。经过多次验证 ,预测的 Halstead 长度与实际的 Halstead 长度是非常接近的。Halstead 度量是目前最好的度量方法。但它也有缺点:没有区别自己编的程序 与别人编的程序 。这是与实际经验相违背的。这时应将外部调用乘上一个大于 1 的的常数Kf(应在 15 之间,它与文档资料的清晰度有关)。没有考虑非执行语句。补救办 法:在统计 n1、n2、N1、N2时,可以把非执行语句中出现的运算对象,运算符统计在内。在允许混合运算的语言中

    12、,每种运算符必 须与它的运算对象相关。如果一种语言有整型、实型、双精度型三种不同类型的运算对象,则任何一种基本算术运算符(、)实际上代表了 4 种运算符。如果语言中有 4 种不同类型的算术运算对象,那么每一种基本算术运算符实际上代表了种运算符。在计算时应考虑这种因数据类型而引起差异的情况。没有注意调用的深度。Halstead 公式应当对调用子程序的不同深度区别对待。在计算嵌套调用的运算符和运算对象时,应乘上一个调用深度因子。这样可以增大嵌套调用时的错误预测率。没有把不同类型的运算对象 ,运算符与不同的 错误 发生率联系起来,而是把它们同等看待。例如,对简单 IF 语句与WHILE 语句就没有区 别。 实际上,WHILE 语句复杂得多,错误发生率也相应地高一些。忽视了嵌套结构(嵌套的循环语句、嵌套 IF 语句、括号结构等)。一般地,运算符的嵌套序列,总比具有相同数量的运算符和运算对象的非嵌套序列要复杂得多。解决的办法是对嵌套结果乘上一个嵌套因子。

    展开阅读全文
    提示  道客多多所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:程序复杂性度量.doc
    链接地址:https://www.docduoduo.com/p-5839831.html
    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    道客多多用户QQ群:832276834  微博官方号:道客多多官方   知乎号:道客多多

    Copyright© 2025 道客多多 docduoduo.com 网站版权所有世界地图

    经营许可证编号:粤ICP备2021046453号    营业执照商标

    1.png 2.png 3.png 4.png 5.png 6.png 7.png 8.png 9.png 10.png



    收起
    展开