软件复杂性表现,如何计算?

简介: 软件复杂性度量的参数很多,主要有:• 规模,即总共的指令数,或源程序行数。• 难度,通常由程序中出现的操作数的数目所决定的量来表示。• 结构,通常用于程序结构有关的度量来表示。• 智能度,即算法的难易程度。

软件复杂性

软件复杂性的基本概念

软件复杂性度量的参数很多,主要有:

  • 规模,即总共的指令数,或源程序行数。
  • 难度,通常由程序中出现的操作数的数目所决定的量来表示。
  • 结构,通常用于程序结构有关的度量来表示。
  • 智能度,即算法的难易程度。

软件复杂性主要表现在程序的复杂性。程序的复杂性主要指模块内程序的复杂性。它直接关联到软件开发费用的多少、开发周期长短和软件内部潜伏错误的多少。同时它也是软件可理解性的另一种度量。

软件复杂性的度量方法

代码行度量法

度量程序的复杂性,最简单的方法就是统计程序的源代码行数。此方法的基本考虑是统计一个程序的源代码行数,并以代码行数作为程序复杂性的质量。

McCabe度量法

McCabe度量法是由Thomas McCabe提出的一种基于程序控制流的复杂性度量方法。McCabe复杂性度量又称环路度量它认为程序的复杂性很大程度上取决于程序的复杂性。单一的顺序结构最为简单,循环和选择所构成的环路越多,程序就越复杂

这种方法以图论为工具,先画出程序图,然后用该图的环路数作为程序复杂性的度量值。程序图是退化的程序流程图。也就是说,把程序流程图的每一个处理符号都退化成一个结点,原来连接不同处理符号的流线变成连接不同结点的有向弧,这样得到的有向图就叫做程序图

McCabe度量法使用例题

程序图仅描述程序内部的控制流程,完全不表现对数据的具体操作分支和循环的具体条件。

例子

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

                                                             V(G)=mn+2p

其中(1)公式含义:

  • V(G)是有向图G中环路数
  • m是图G中弧数
  • n是图G中结点数
  • p是图G中强连通分量个数

强连通图的p=1;也就是说2P=2;

在程序图G中,从程序图G的入口点总能到达图中任何一个结点,因此,程序总是连通的,但不是强连通的。为了使图成为强连通图,从图的入口点到出口点加一条用虚线【不计入计算的边数】表示的有向边,使图成为强连通图。

                                                               V(G)=1311+2=4

可算出McCabe环复杂度度量值为4。这里选择的4个线形无关环路,其他任何环路都是这4个环路的线形组合。

利用McCabe环复杂度度量值时,有几点说明。
  • 环路复杂度取决于程序控制结构的复杂度。当程序的分支数目或循环数目时其复杂度也增加。环路复杂度与程序中覆盖的路径条数有关。
  • 环路复杂度是可增加的。例如,模块A的复杂度为3,模块B的复杂度为4,则模块A与模块B的复杂度是7。
  • McCabe建议,对于复杂度超过10的程序,应分成几个小程序,以减少程序中的错误。
  • 这种度量的缺点是:
  1. 对于不同种类的控制流的复杂度不能区分
  2. 简单IF语句与循环语句的复杂性同等看待。
  3. 嵌套IF语句与简单CASE的复杂性是一样的。
  4. 模块间接口当成一个简单分支一样处理。
  5. 一个具有1000行的顺序程序与一行语句的复杂性相同。
目录
相关文章
|
3月前
|
机器学习/深度学习 监控
在进行多任务学习时,如何确保模型不会过度拟合单一任务而忽视其他任务?
在进行多任务学习时,如何确保模型不会过度拟合单一任务而忽视其他任务?
|
3月前
|
设计模式
软件设计与架构复杂度问题之认知负荷的定义如何解决
软件设计与架构复杂度问题之认知负荷的定义如何解决
|
4月前
|
存储 自然语言处理 开发者
通用性与灵活性对大模型的影响
通用性与灵活性对大模型的影响
|
4月前
|
开发框架 Cloud Native Devops
对抗软件复杂度问题之软件复杂度的增加会导致研发效率降低,如何解决
对抗软件复杂度问题之软件复杂度的增加会导致研发效率降低,如何解决
|
4月前
|
测试技术 开发者
对抗软件复杂度问题之系统架构对软件复杂度的有什么影响,如何解决
对抗软件复杂度问题之系统架构对软件复杂度的有什么影响,如何解决
|
4月前
|
定位技术 UED 开发者
对抗软件复杂度问题之软件的复杂度增长会带来什么问题,如何解决
对抗软件复杂度问题之软件的复杂度增长会带来什么问题,如何解决
|
4月前
|
开发者
对抗软件复杂度问题之软件的复杂度会不断上升,如何解决
对抗软件复杂度问题之软件的复杂度会不断上升,如何解决
|
6月前
|
机器学习/深度学习 人工智能 数据可视化
如何从灵活性角度评估数据可视化工具的优劣?
【5月更文挑战第18天】如何从灵活性角度评估数据可视化工具的优劣?
54 4
|
编解码 监控 算法
文档管理软件中的精度优化:蝶行算法的崭露头角
蝶行算法是一种基于蝴蝶飞行的优化算法,其主要思想是模拟蝴蝶在寻找食物时的飞行路径,通过不断调整飞行方向和速度,最终找到最优解。
238 1
|
6月前
|
移动开发 测试技术 Android开发
构建高效Android应用:从优化用户体验到提升性能表现
【5月更文挑战第15天】 在移动开发领域,一个成功的Android应用不仅需要具备吸引用户的功能,更应提供流畅和高效的用户体验。随着技术的不断进步,开发者面临着将先进技术集成到现有架构中以提高应用性能的挑战。本文将深入探讨如何通过最新的Android框架和工具来优化应用性能,包括对UI的响应性、内存管理以及多线程处理等关键方面的改进,旨在帮助开发者构建出更加强大、快速且稳定的Android应用。
下一篇
无影云桌面