软件复杂性

http://student.zjzk.cn/course_ware/software/txt/txt/show.asp?filename=11_3.txt

11.3 软件复杂性
11.3.1 软件复杂性的基本概念
    软件复杂性度量的参数很多,主要有:
    (1) 规模,即总共的指令数,或源程序行数。
    (2) 难度,通常由程序中出现的操作数的数目所决定的量来表示。
    (3) 结构,通常用于程序结构有关的度量来表示。
    (4) 智能度,即算法的难易程度。
    软件复杂性主要表现在程序的复杂性。程序的复杂性主要指模块内程序的复杂性。它直接关联到软件开发费用的多少、开发周期长短和软件内部潜伏错误的多少。同时它也是软件可理解性的另一种度量。
要求复杂性度量满足以下假设:
    (1) 它可以用来计算任何一个程序的复杂性。
    (2) 对于不合理的程序,例如对于长度动态增长的程序,或者对于原则上无法排错的程序,不应当使用它进行复杂性计算。
    (3) 如果程序中指令条数、附加存储量、计算时间增多,不会减少程序的复杂性。
11.3.2 软件复杂性的度量方法
    1. 代码行度量法
    度量程序的复杂性,最简单的方法就是统计程序的源代码行数。此方法的基本考虑是统计一个程序的源代码行数,并以源代码行数作为程序复杂性的质量。
    2. McCabe度量法
    McCabe度量法是由Thomas McCabe提出的一种基于程序控制流的复杂性度量方法。McCabe复杂性度量又称环路度量。它认为程序的复杂性很大程度上取决于程序的复杂性。单一的顺序结构最为简单,循环和选择所构成的环路越多,程序就越复杂。这种方法以图论为工具,先画出程序图,然后用该图的环路数作为程序复杂性的度量值。程序图是退化的程序流程图。也就是说,把程序流程图的每一个处理符号都退化成一个结点,原来连接不同处理符号的流线变成连接不同结点的有向弧,这样得到的有向图就叫做程序图。
程序图仅描述程序内部的控制流程,完全不表现对数据的具体操作分支和循环的具体条件。因此,它往往把一个简单的IF语句与循环语句的复杂性看成是一样的,把嵌套的IF语句与CASE的复杂性看成是一样的。下面给出计算环路复杂性的方法,如图11-4所示。

根据图论,在一个强连通的有向图G中,环的个数V(G)由以下公式给出:

                     V(G)=m-n+2p

其中,V(G)是有向图G中环路数,m是图G中弧数,n是图G中结点数,p是图G中强连通分量个数。在一个程序中,从程序图的入口点总能到达图中任何一个结点,因此,程序总是连通的,但不是强连通的。为了使图成为强连通图,从图的入口点到出口点加一条用虚线表示的有向边,使图成为强连通图。这样就可以使用上式计算环路复杂性了。
以图4-11所给出的例子示范,其中,结点数n=6,弧数m=9,p=1,则有

               V(G=m-n+2p=9-6+2=5

即McCabe环复杂度度量值为5。这里选择的5个线形无关环路为(abefa),(beb),(abea),(acfa),(abcfa),其他任何环路都是这5个环路的线形组合。
    当分支或循环的数目增加时,程序中的环路也随之增加,因此,McCabe环复杂度度量值实际上是为软件测试的难易程度提供一个定量度量的方法,同时也间接表示了软件的可靠性。实验表明,源程序中存在的错误数以及为了诊断he 纠正这些错误所需要的时间与McCabe环复杂度度量值有明显的关系。
    利用McCabe环复杂度度量值时,有几点说明。
   (1) 环路复杂度取决于程序控制结构的复杂度。当程序的分支数目或循环数目时其复杂度也增加。环路复杂度与程序中覆盖的路径条数有关。
   (2) 环路复杂度是可增加的。例如,模块A的复杂度为3,模块B的复杂度为4,则模块A与模块B的复杂度是7。
   (3) McCabe建议,对于复杂度超过10的程序,应分成几个小程序,以减少程序中的错误。
   (4) 这种度量的缺点是:
    ①对于不同种类的控制流的复杂度不能区分。
    ②简单IF语句与循环语句的复杂性同等看待。
    ③嵌套IF语句与简单CASE的复杂性是一样的。
    ④模块间接口当成一个简单分支一样处理。
    ⑤一个具有1000行的顺序程序与一行语句的复杂性相同。
    尽管McCabe复杂度度量法有许多缺点,但它容易使用,而且在选择方案和估计排错费用等方面都是很有效的。

时间: 2024-07-29 10:04:24

软件复杂性的相关文章

编程思想进化史与软件复杂性

软件问题对象的问题: 1)业务逻辑的复杂型: 2)软件组件的规模: 软件复杂度的升级:一维线性(单纯计算):二维平面(带有业务逻辑的结构型计算):三维立体:描述复杂的现实世界: 针对软件开发任务的升级,编程思想也有一个相应的升级过程: 编程思想的进化: 1)面向计算:计算机出现的驱动力,具有唯一解: 2)面向过程.结构:具有有限解: 3)面向对象:具有无限解: 原文地址:https://www.cnblogs.com/feng9exe/p/8274875.html

软件复杂性的通俗理解

太乱了:无组织无纪律: https://www.cnblogs.com/feng9exe/p/8232655.html 太大了:涉及的功能太多: https://www.cnblogs.com/feng9exe/p/5595466.html 太难了: 算法和理论的的难度. https://www.cnblogs.com/feng9exe/p/7598391.html 复杂性 = 规模 + 非线性 + 不确定性 + 无序性 https://www.cnblogs.com/feng9exe/p/84

软件工程概论第三章--软件项目管理

本章介绍了软件项目管理的相关知识,从软件项目管理概述.人员组织与管理.项目沟通管理.软件项目规划.软件风险管理及软件配置管理这几个方面展开讲述,详细的介绍了软件项目实行过程中的管理知识. 软件项目管理概述主要讲了:1.软件项目的特征,即软件产品的不可见性.项目的高度不确定性.软件过程的多变化性.软件人员的高流动性等.2.软件项目管理的“4P”,人员.产品.过程.项目.3.软件项目的管理活动,项目启动.项目规划.项目实施.项目收尾.概论讲述了软件项目管理的一些活动和重要的因素等. 人员组织与管理主

软考中级软件设计师考试大纲

软件设计师考试大纲 一.考 试 说 明 1.考试目标 通过本考试的合格人员能根据软件开发项目管理和软件工程的要求,按照系统总体设计规格说明书进行软件设计,编写程序设计规格说明书等相应的文档,组织和指导程序员编写.调试程序,并对软件进行优化和集成测试,开发出符合系统总体设计要求的高质量软件:具有工程师的实际工作能力和业务水平. 2.考试要求 (1)掌握计算机内的数据表示.算术和逻辑运算方法: (2)掌握相关的应用数学及离散数学基础知识: (3)掌握计算机体系结构以及各主要部件的性能和基本工作原理:

《软件工程 ——理论、方法与实践》知识概括第三章 软件项目管理

第3章 软件项目管理   软件项目管理有利于将软件开发人员的个人开发能力转化为企业的开发能力,并使企业的软件开发能力不断提高和成熟. 一.软件项目管理概述 软件项目管理是为了使软件项目能够按照预定的成本.进度.质量顺利完成,而对成本.人员.进度.质量.风险等进行分析和管理的活动. 软件项目的特征:1.软件产品的不可见性:2.项目的高度不确定性:3.软件过程的多变化性:4.软件人员的高流动性. 软件项目管理的“4P”:人员(People).产品(Product).过程(Process)和项目(Pr

为什么软件里总会有那么多Bug?

在代码上耗费的时间和资金越多,程序防御力就越强——但是黑客们总有办法找到其中的漏洞. 又是整整一个月,整整一个月忙着安装补丁——回环往复.无穷无尽,一想起来就头大. 我们的软件编码工具有着默认的内置安全防御措施,我们的编程语言是安全的,我们的程序员使用的是 SDL (security development lifecycle)编码工具和技术,我们的操作系统有着不断升级的安全设置,供应商也一直不断地侦查和攻击自己的软件意图找到漏洞,甚至还有的公司花费几十亿美元用于消除软件 bug. 我们一直在勤

软件设计师考试大纲

一.考试说明 1. 考试目标 通过本考试的合格人员能根据软件开发项目管理和软件工程的要求,按照系统总体设计规格说明书进行软件设计,编写程序设计规格说明书等相应的文档,组织和指导程序员编写.调试程序,并对软件进行优化和集成测试,开发出符合系统总体设计要求的高质量软件:具有工程师的实际工作能力和业务水平. 2. 考试要求 (1)掌握计算机内的数据表示.算术和逻辑运算方法: (2)掌握相关的应用数学及离散数学基础知识: (3)掌握计算机体系结果以及各主要部件的性能和基本工作原理: (4)掌握操作系统.

【整理】软件工程复习提纲(软件项目管理)

章鱼小年糕整理,如果有错误欢迎提出,若要二次修改发布,请留言,谢谢^_^! 概念 管理:通过计划.组织和控制等一系列活动,合理地配置和使用各种资源,以达到既定目标的过程. 软件项目管理:先于任何技术活动之前,并且贯穿于软件的整个生命周期之中. 代码行技术(LOC):根据以往开发过的类似产品或模块的经验,以及相关的历史数据,估计一个功能所需要的源程序行数. 功能点技术(FP):依据对软件信息域特性和软件复杂性评估结果估算软件的规模,度量结果是功能点(FP). 估算开发时间:认为人月工作量是线性的是

【软考】【软件设计师】【考试大纲】

软件设计师考试大纲 一.考试说明 1.考试目标 通过本考试的合格人员能根据软件开发项目管理和软件工程的要求,按照系统总体设计规格说明书进行软件设计, 编写程序设计规格说明书等相应的文档, 组织和指导程序员编写.调试程序, 并对软件进行优化和集成测试,开发出符合系统总体设计要求的高质量软件: 具有工程师的实际工作能力和业务水平. 2.考试要求 (1)掌握计算机内的数据表示.算术和逻辑运算方法:(2)掌握相关的应用数学及离散数学基础知识:(3)掌握计算机体系结构以及各主要部件的性能和基本工作原理:(