软件复杂度概述
mccabe复杂度计算

mccabe复杂度计算McCabe复杂度,也被称为圈复杂度,是一种软件度量指标,用于衡量程序的复杂程度。
它是通过计算程序中的控制流图的节点数和边数来实现的。
在计算McCabe复杂度时,可以用以下公式:V(G)=E-N+2其中V(G)代表程序的McCabe复杂度,E代表控制流图的边数,N代表控制流图的节点数。
控制流图是一种表示程序中各个执行路径的图形化工具。
它由节点和边组成,节点代表程序中的语句或决策点,边代表程序执行的路径。
在控制流图中,用一个圆圈表示一个节点,边则是连接节点的线。
在计算控制流图的边数时,可以用以下公式:E=D+1其中E代表边数,D代表决策节点数。
决策节点是控制流图中的条件语句,如if语句、switch语句等。
在计算控制流图的节点数时,可以用以下公式:N=K+1其中N代表节点数,K代表程序中的顺序结构语句数。
顺序结构语句是指程序中的串行执行的语句,如赋值语句、方法调用语句等。
通过以上公式,可以得到程序的McCabe复杂度。
McCabe复杂度的值越高,表明程序的控制流程越复杂,这通常意味着程序更加难以理解、测试和维护。
McCabe复杂度的计算结果可以用来指导软件开发的质量控制。
通常情况下,一个函数的McCabe复杂度应在10以内,一个模块或类的McCabe复杂度应在20以内。
如果超过这个值,就意味着代码需要进行重构以简化控制流程。
通过对程序进行词法分析和语法分析,可以构建程序的控制流图,并计算McCabe复杂度。
除了计算整个程序的复杂度,还可以针对具体的函数、方法或类进行计算,以帮助开发人员更好地优化代码结构。
在软件开发过程中,了解和掌握McCabe复杂度的计算方法,可以帮助开发人员更好地评估和改进代码的质量,并优化代码的可读性、可维护性和可测试性。
这对于提高软件开发效率和降低软件维护成本非常有帮助。
软件测试中的代码覆盖率和代码复杂度

软件测试中的代码覆盖率和代码复杂度在软件测试过程中,代码覆盖率和代码复杂度是两个重要的指标。
代码覆盖率是指在测试中执行的代码与总代码量之比,它可以用来评估测试的充分性和有效性。
代码复杂度是指代码的结构和逻辑上的复杂程度,它可以用来评估代码的可读性、可维护性以及潜在的错误风险。
本文将对代码覆盖率和代码复杂度进行详细介绍,并讨论其在软件测试中的重要性。
一、代码覆盖率代码覆盖率是衡量测试用例中所覆盖的代码比例的指标。
它可以分为语句覆盖、判定覆盖、条件覆盖以及路径覆盖等不同的级别。
语句覆盖是指每个代码语句至少被执行一次;判定覆盖是指每个判定语句的每个可能结果至少被执行一次;条件覆盖是指每个判定语句的每个条件均为真和假;路径覆盖是指覆盖每个可能的路径。
提高代码覆盖率可以帮助发现和修复隐藏的错误,减少代码中的潜在缺陷。
通过执行更多的测试用例,可以增加代码覆盖率,从而提高对代码的测试质量。
在软件测试中,常用的测试技术包括黑盒测试和白盒测试。
黑盒测试不需要了解内部实现细节,只关注功能和接口的正确性,而白盒测试需要了解代码的内部结构和逻辑,更容易实现全面的代码覆盖。
二、代码复杂度代码复杂度是评估代码难易程度和质量的指标。
较高的代码复杂度意味着代码结构复杂、逻辑分支较多,难以理解、测试和维护。
常用的代码复杂度度量方法包括圈复杂度、路径复杂度和类复杂度等。
圈复杂度是一种用来度量程序模块复杂度的方法,它通过计算代码中的判定结构和循环结构的数量来评估代码的复杂程度。
圈复杂度越高,代码的质量和可维护性就越差。
路径复杂度是通过计算程序中可能的执行路径数目来评估代码的复杂程度。
类复杂度是通过计算类内部成员(方法和属性)的数量来评估类的复杂程度。
降低代码复杂度可以提高代码的可读性、可维护性和可测试性。
简洁明了的代码结构和逻辑可以减少错误的产生和隐藏,方便进行软件测试和调试。
在编写代码时,应遵循良好的编码规范和设计原则,尽量减少代码的复杂度。
程序复杂性度量

程序复杂性度量程序复杂性主要指模块内程序的复杂性。
它直接关联到软件开发费用的多少,开发周期的长短和软件内部潜伏错误的多少。
同时它也是软件可理解性的另一种度量。
减少程序复杂性,可提高软件的简单性和可理解性,并使软件开发费用减少,开发周期缩短,软件内部潜藏错误减少一、代码行度量法度量程序的复杂性,最简单的方法就是统计程序的源代码行数。
此方法基于两个前提:(1)程序复杂性随着程序规模的增加不均衡地增长;(2)控制程序规模的方法最好是采用分而治之的办法。
将一个大程序分解成若干个简单的可理解的程序段。
方法的基本考虑是统计一个程序模块的源代码行数目,并以源代码行数做为程序复杂性的度量。
若设每行代码的出错率为每100行源程序中可能有的错误数目,例如每行代码的出错率为1%,则是指每100行源程序中可能有一个错误。
Thayer曾指出,程序出错率的估算范围是从0.04%~7%之间,即每100行源程序中可能存在0.04~7个错误。
他还指出,每行代码的出错率与源程序行数之间不存在简单的线性关系。
Lipow进一步指出,对于小程序,每行代码的出错率为1.3%~1.8%;对于大程序,每行代码的出错率增加到2.7%~3.2%之间,但这只是考虑了程序的可执行部分,没有包括程序中的说明部分。
Lipow及其他研究者得出一个结论:对于少于100个语句的小程序,源代码行数与出错率是线性相关的。
随着程序的增大,出错率以非线性方式增长。
所以,代码行度量法只是一个简单的,估计得很粗糙的方法。
二、McCabe度量法McCabe度量法是一种基于程序控制流的复杂性度量方法。
McCabe定义的程序复杂性度量值又称环路复杂度,它基于一个程序模块的程序图中环路的个数。
如果把程序流程图中每个处理符号都退化成一个结点,原来联结不同处理符号的流线变成连接不同结点的有向弧,这样得到的有向图就叫做程序图。
计算有向图G的环路复杂性的公式:V(G)=m-n+2其中,V(G)是有向图G中的环路个数,m是图G中有向弧个数,n是图G中结点个数。
软件工程中的软件度量

软件工程中的软件度量软件度量是指通过定量的测量方法来评估软件产品、过程和项目的属性或特征。
它是软件工程中不可或缺的一部分,能够帮助开发者和管理者更好地了解软件的质量、进度和成本等方面的指标。
本文将介绍软件度量的概念、分类和应用,并探讨其在软件工程中的重要性。
一、概述软件度量是指使用一定的度量方法和度量标准对软件的各种特性进行量化和评估的过程。
它可以帮助开发团队衡量软件的属性、性能、质量和进度等方面的指标,为软件项目的管理和开发提供有效的数据支持。
二、分类软件度量可以按不同的角度进行分类,常见的分类方式有以下几种:1. 功能度量:评估软件的功能性能,如用户需求的满足程度、功能是否完备等。
2. 成本度量:衡量软件开发和维护的成本,包括人力、时间、物力等方面的评估。
3. 质量度量:评价软件的质量特性,如可靠性、可维护性、可测试性等。
4. 复杂度度量:评估软件的复杂性,包括代码行数、函数调用关系、模块依赖关系等。
5. 效率度量:评估软件的运行效率和资源利用率,如响应时间、内存占用等。
三、应用软件度量在软件工程中具有广泛的应用,以下是几个常见的应用领域:1. 项目管理:通过对软件开发过程进行度量,可以评估项目的进度、风险和成本等,帮助项目经理制定合理的计划和管理策略。
2. 质量控制:通过度量软件的质量特性,可以及时发现和解决潜在的质量问题,提高软件的可靠性和稳定性。
3. 产品评估:通过对软件功能、性能和用户满意度等方面的度量,可以评估产品的优劣和市场竞争力。
4. 过程改进:通过度量软件开发过程中的各种指标,可以找出优化空间,改进开发方法和流程,提高软件开发效率。
5. 决策支持:通过对软件相关指标的度量,可以为管理层提供决策依据,帮助其制定战略和战术决策。
四、重要性软件度量在软件工程中的重要性不可忽视。
它不仅提供了对软件产品和过程的量化评估,还能够帮助开发团队和管理者发现问题、改进流程、提高质量和效率。
通过精确的度量数据,可以更好地管理软件项目,减少风险,并为决策提供科学依据。
软件测试中的复杂度分析

软件测试中的复杂度分析在软件测试过程中,复杂度分析是一个重要的步骤。
通过分析软件项目的复杂度,我们可以评估测试的难度,并制定出合理的测试策略和方法。
本文将介绍软件测试中的复杂度分析方法和其在测试过程中的应用。
一、复杂度分析的意义复杂度分析是指对软件系统或者系统组件的结构、功能、接口、数据等进行分析,以评估其复杂度。
它可以帮助测试人员全面了解被测软件的复杂程度,为测试活动提供有效的指导和决策支持。
通过复杂度分析,测试人员可以确定测试的重点和难点,为测试资源的合理配置提供依据,提高测试效率和测试质量。
二、复杂度分析方法1. 静态复杂度分析静态复杂度分析是指通过对被测软件的源代码、设计文档等进行分析,计算出软件系统的复杂度。
常用的静态复杂度分析方法包括:(1)代码行数统计:通过统计软件系统的代码行数来评估软件的复杂程度。
代码行数越多,软件的复杂度相对较高。
(2)圈复杂度分析:圈复杂度是一种对软件模块的复杂度进行量化的方法。
它通过计算一个模块中的判定结构的数量来评估模块的复杂度。
圈复杂度越高,模块的复杂度越高。
2. 动态复杂度分析动态复杂度分析是指通过执行软件系统的测试用例来评估软件的复杂程度。
常用的动态复杂度分析方法包括:(1)路径覆盖分析:路径覆盖分析是指对软件系统的各个执行路径进行覆盖度分析。
通过分析每个路径的覆盖情况,可以评估软件的复杂程度和测试用例的覆盖能力。
(2)数据流分析:数据流分析是指对软件系统中的数据流进行分析。
通过跟踪数据的流向和变换,可以评估软件系统的复杂度和数据依赖关系。
三、复杂度分析的应用复杂度分析在软件测试过程中具有重要的应用价值。
1. 确定测试的重点和难点通过复杂度分析,可以确定被测软件系统中的重点模块和难点模块。
在测试资源有限的情况下,测试人员可以将更多的测试时间和资源用于这些模块上,提高测试的覆盖率和效果。
2. 制定合理的测试策略和方法根据复杂度分析的结果,测试人员可以制定出合理的测试策略和方法。
软件复杂度与SourceMonitor

提供了系统级模块设计复杂度的概况,不反映独立模块的内部情况; 指出一个模块整体的复杂度,反映了每个模块和其内部模块的控制关系; 有助于集成复杂度的计算。
(5)集成复杂度(Integration Complexity (S1) )
概念 集成复杂度是为了防止错误所必须进行的集成测试的数量表示,另一种说法
针对模块的控制流图时,可以直接统计判定节点数,这样更为简单;
针对复杂的控制流图时,使用区域计算公式v(G)=R更为简单。
6、 示例
1
int foo(bool isOK) { const int ZERO = 0; int* pInt = NULL; if (isOk) { pInt = &ZERO; } return *pInt; }
三、SourceMonitor
1、 概念
圈复杂度(Cyclomatic Complexity (v(G)) )是用来衡量一个模块判定结构的 复杂程度,数量上表现为独立路径的条数,即合理的预防错误所需测试的最
少路径条数。
圈复杂度度量以软件的控制流图为基础。 经验表明,程序的可能错误和高的圈复杂度有着很大关系 , McCabe &
4、 软件使用 (14)检查代码——图表视图——频率图
4、 软件使用 (15)检查代码——图表视图——Kiviat图
5、 工程示例 以NC源程序为例,介绍SourceMonitor软件的使用。
2、 McCabe复杂度分类
McCabe复杂度
圈 复 杂 度
基 本 复 杂 度
模 块 设 计 复 杂 度
设 计 复 杂 度
集 成 复 杂 度
行 数
规 范 化 复 杂 度
软件测试中的复杂度测试技术

软件测试中的复杂度测试技术软件测试是确保软件质量的关键过程之一。
除了测试软件的功能和性能外,测试软件的复杂度也非常重要。
在软件开发过程中,复杂度测试技术能够帮助开发人员评估软件的复杂程度,并发现潜在的问题。
本文将介绍几种常用的软件测试中的复杂度测试技术。
一、代码覆盖率测试代码覆盖率测试是一种常见的复杂度测试技术。
它通过检测测试用例是否执行了特定的代码路径来评估测试代码的复杂性。
代码覆盖率测试可以分为语句覆盖、分支覆盖和条件覆盖等不同的级别。
其中,语句覆盖要求测试用例执行每个语句至少一次,分支覆盖要求测试用例覆盖代码中的所有分支路径,条件覆盖要求测试用例覆盖代码中的所有条件判断。
通过代码覆盖率测试,开发人员可以了解测试用例的质量和完整性,进而评估软件的复杂度。
二、路径覆盖测试路径覆盖测试是一种更为细粒度的复杂度测试技术。
它要求测试用例覆盖软件中的所有可能路径,以确保程序在各种情况下的正确性。
路径覆盖测试不仅能够评估代码的复杂度,还能够发现可能的逻辑错误和未处理的异常情况。
然而,由于软件系统的复杂性,完全实现路径覆盖可能是不可行的。
因此,开发人员需要根据具体情况选择合适的路径覆盖策略,如基本路径覆盖、全路径覆盖、循环路径覆盖等。
三、数据流测试数据流测试是一种基于程序变量和其之间的关系进行测试的复杂度测试技术。
它通过分析程序中的数据流,构造具有高复杂度的测试用例,以发现可能的数据异常和逻辑错误。
数据流测试可以帮助开发人员评估软件的复杂性,尤其是对于涉及数据依赖和数据关联的功能模块。
数据流测试可以细分为定义使用测试、使用定义测试、全定义测试和全使用测试等不同的策略。
通过数据流测试,开发人员可以对软件的数据处理能力进行全面的评估,提高软件的可靠性和稳定性。
四、界面测试界面测试是一种针对软件界面进行的复杂度测试技术。
在软件开发过程中,用户界面往往是软件复杂度的主要来源之一。
因此,通过界面测试,可以评估软件界面的复杂性,并发现潜在的交互问题和用户体验不佳的地方。
如何进行软件复杂度分析与降低

如何进行软件复杂度分析与降低软件复杂度分析与降低在当今科技高速发展的时代,软件已经成为了人们生活不可或缺的一部分。
然而,随着软件功能的不断增加和需求的不断变化,软件的复杂度也在不断提高。
为了提高软件的可维护性和可扩展性,进行软件复杂度分析并采取相应的降低措施变得至关重要。
一、软件复杂度分析软件复杂度分析是指对软件系统进行综合评估,以确定软件的复杂度水平。
常用的软件复杂度指标包括代码行数、类的数量、方法的数量等。
通过对这些指标的分析,可以了解软件的结构和规模,从而评估软件的复杂度。
1. 代码行数分析代码行数是衡量软件复杂度的重要指标之一。
通常情况下,代码行数越多,软件的复杂度就越高。
因此,可以通过统计代码行数来评估软件的复杂度水平。
同时,还可以通过代码行数的变化来判断软件的维护难度和扩展性。
2. 类和方法数量分析类和方法数量也是评估软件复杂度的重要指标。
类的数量越多,方法的数量越多,软件的复杂度就越高。
因此,可以通过统计类和方法的数量来评估软件的复杂度水平。
同时,还可以通过类和方法的关系来判断软件的耦合度和内聚性。
3. 代码重复率分析代码重复率是评估软件复杂度的另一个重要指标。
代码重复率越高,软件的复杂度就越高。
因此,可以通过统计代码重复率来评估软件的复杂度水平。
同时,还可以通过减少代码的重复率来降低软件的复杂度。
二、软件复杂度降低软件复杂度降低是指通过采取一系列措施来减少软件的复杂度。
下面介绍几种常见的降低软件复杂度的方法。
1. 模块化设计模块化设计是一种将软件系统划分为多个独立的模块,并通过定义清晰的接口来实现模块之间的通信和协作的方法。
通过模块化设计,可以将复杂的系统分解为多个相对简单的模块,从而降低软件的复杂度。
2. 代码重构代码重构是指对现有代码进行修改和优化,以提高代码的可读性、可维护性和可扩展性的过程。
通过代码重构,可以去除冗余代码、简化复杂代码、提取公共代码等,从而降低软件的复杂度。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
软件复杂度概述在硬件的可靠性设计中,有一条基本原则“简单就是可靠”。
这个原则同样也适合软件,与功能的增多或增强相伴的是不断升级与补丁。
现在已经有若干种软件复杂性的度量方法可供参考,其中McCabe QA是比较出色和实用的方法,它能够计算出多种软件复杂度,由此可对软件进行检查、分析和查明那些可能导致错误的代码。
复杂度70年代,软件系统已经变得极其复杂,无论是开发还是维护都是一项成本高昂的工作。
人们意识到必须使软件模块化,以便于开发、测试和维护。
为此,成立于1976的McCabe&Associates公司开发出了McCabe Cyclomatic Complexity Metric(圈复杂度)技术对软件进行结构测试。
Metric以软件复杂度测量的数目为基础,能帮助工程师识别难于测试和维护的模块,圈复杂度已经成为评估软件质量的一个重要标准。
人们可以用圈复杂度对软件的复杂度和质量进行衡量,来安排工程进度,在成本、进度和性能之间寻求平衡。
复杂度的种类有模块、类和程序三类复杂度。
模块复杂度包含了关于模块的复杂度信息;类复杂度是针对那些使用McCabe面向对象特性的程序,它包含了关于类的复杂度信息;程序复杂度包含了关于程序的复杂度信息。
集成复杂度报告对应于三种复杂度的是三种复杂度报告。
如果一个报告的复杂度信息不只一种,那么就把这些复杂度信息组合成新的报告。
集成复杂度信息只收集一个部件及其下级的信息。
例如:如果一个程序级报告包含一个类复杂度,那么只报告组成程序的类的信息,而不包含类组成的信息。
McCabe复杂度McCabe复杂度是对软件结构进行严格的算术分析得来的,实质上是对程序拓扑结构复杂性的度量,明确指出了任务复杂部分。
McCabe复杂度包括:圈复杂度、基本复杂度、模块设计复杂度、设计复杂度、集成复杂度、行数、规范化复杂度、全局数据复杂度、局部数据复杂度、病态数据复杂度。
McCabe复杂度的用途在软件工程中,有三种使用McCabe复杂性度量的方式。
作为测试的辅助工具。
McCabe复杂性度量的结果等于通过一个子程序的路径数,因而需要设计同样多的测试案例以覆盖所有的路径。
如果测试案例数小于复杂性数,则有三种情况一是需要更多的测试;二是某些判断点可以去掉;三是某些判断点可用插入式代码替换。
作为程序设计和管理指南。
在软件开发中,需要一种简单的方式指出可能出问题的子程序。
保持子程序简单的通用方法是设置一个长度限制,例如50行或2页,但这实际上是在缺乏测试简明性的有效方法时无可奈何的替代方法。
不少人认为McCabe度量就是这样一种简明性度量。
但是要注意,McCabe度量数大的程序,不见得结构化就不好。
例如,Case语句是良结构的,但可能有很大的McCabe度量数(依赖于语句中的分支数),这可能是由于问题和解决方案所固有的复杂性所决定的。
使用者应当自己决定如何使用McCabe度量所提供的信息。
作为网络复杂性度量的一种方法。
Hall和Preiser提出了一种组合网络复杂性度量,用于度量可能由多个程序员组按模块化原理建立的大型软件系统的复杂性。
他们提出的组合度量公式为式中C1,...,Ck是各个模块的复杂性;CN是网络复杂性;W1和W2为权值。
McCabe复杂度即可用于度量各个模块的复杂性,也可用于度量网络复杂性。
Cyclomatic Complexity (v(G))圈复杂度圈复杂度是用来衡量一个模块判定结构的复杂程度,数量上表现为独立路径的条数,即合理的预防错误所需测试的最少路径条数,圈复杂度大说明程序代码可能质量低且难于测试和维护,经验表明,程序的可能错误和高的圈复杂度有着很大关系。
计算方法节点是程序中代码的最小单元,边代表节点间的程序流。
如果一个模块流程图有e条边n个节点,它的圈复杂度V(G)=e-n+2,典型的V(G)max=10。
图1中示例的圈复杂度是2。
优点避免软件中的错误倾向;指出极复杂模块,这样的模块也许可以进一步细化;度量测试计划,确定测试重点;在开发过程中通过限制程序逻辑,指导测试过程;指出将要测试的区域;帮助测试人员确定测试和维护对象;与所用的高级程序设计语言类型无关。
应用圈复杂度指出为了确保软件质量应该检测的最少基本路径的数目。
在实际中,测试每一条路经是不现实的,测试难度随着路径的增加而增加。
但测试基本路径对衡量代码复杂度的合理性是很必要的。
McCabe & Associates建议圈复杂度到10,因为高的圈复杂度使测试变得更加复杂而且增大了软件错误产生的概率。
提示:圈复杂度度量是测量在一个软件模块中的分支数目,在所有的开发周期中都要使用。
圈复杂度度量以软件的结构流程图为基础。
控制流程图描述了软件模块的逻辑结构。
一个模块在典型的语言中是一个函数或子程序,有一个入口和一个出口,也可以通过调用/返回机制设计模块。
软件模块的每个执行路径,都有与从模块的控制流程图中的入口到出口的节点相符合的路径。
“Cyclomatic”来源于非直接连接基本测试周期的数目,更重要的是,也通过直接相连的图表给出独立路径的数目。
通过图表的相关性,一个节点可到达另一个节点。
圈复杂度度量也可作为模块基本流程图路径的数目,其重点在于模块线形组合后,所产生的路径数目是最小的。
对圈复杂度的限制现在有许多好方法可以用来限制圈复杂度。
过于复杂的模块容易出错,难于理解、测试、更正,所以应当在软件开发的各个阶段有意识地限制复杂度,许多开发者已经成功地实现把对软件复杂度的限制作为软件项目的一部分,尽管在确切的数目上略微有些争议。
最初支持的数目是10,现在支持数目可达15。
但是,只应当在条件较好的情况下使数目大于10,例如开发者非常有经验,设计合乎正式标准,使用现代化的程序语言、结构程序、代码预排和先进的测试计划。
换句话说,开发团队可以选择超过10的限制数目,但是必须根据经验进行一些取舍,把精力花在比较复杂的模块上。
Essential Complexity (ev(G))基本复杂度基本复杂度是用来衡量程序非结构化程度的,非结构成分降低了程序的质量,增加了代码的维护难度,使程序难于理解。
因此,基本复杂度高意味着非结构化程度高,难以模块化和维护。
实际上,消除了一个错误有时会引起其他的错误。
计算方法将圈复杂度图中的结构化部分简化成一个点,计算简化以后流程图的圈复杂度就是基本复杂度。
优点衡量非结构化程度;反映代码的质量;预测代码维护量,辅助模块划分;与所用的高级程序设计语言类型无关。
应用当基本复杂度为1,这个模块是充分结构化的;当基本复杂度大于1而小于圈复杂度,这个模块是部分结构化的;当基本复杂度等于圈复杂度,这个模块是完全非结构化的。
Module Design Complexity (iv(G))模块设计复杂度模块设计复杂度是用来衡量模块判定结构,即模块和其他模块的调用关系。
软件模块设计复杂度高意味模块耦合度高,这将导致模块难于隔离、维护和复用。
计算方法模块设计复杂度是从模块流程图中移去那些不包含调用子模块的判定和循环结构后得出的圈复杂度,因此模块设计复杂度不能大于圈复杂度,通常是远小于圈复杂度。
优点衡量模块对其下层模块的支配作用;衡量一个模块到其子模块进行集成测试的最小数量;定位可能多余的代码;以复杂的计算逻辑和设计来区分模块;是设计复杂度(S0)和集成复杂度(S1)计算的基础;与所用的高级程序设计语言类型无关。
Design Complexity (S0)设计复杂度设计复杂度以数量来衡量程序模块之间的相互作用关系,它提供了系统级模块设计复杂度的概况,有助于衡量进行自底向上集成测试的效果,而且提供了全面衡量程序设计规格和复杂度的数据,不反映独立模块的内部情况。
高设计复杂度的系统意味着系统各部分之间有着复杂的相互关系,这样系统将难以维护。
S0是程序中所有模块设计复杂度之和,计算公式如下:优点可应用于完整的软件,也可应用于任何子系统;衡量代码的质量;指出一个模块整体的复杂度,反映了每个模块和其内部模块的控制关系;揭示了程序中模块调用的复杂度;有助于集成复杂度的计算。
Integration Complexity (S1)集成复杂度集成复杂度是为了防止错误所必须进行的集成测试的数量表示,另一种说法是程序中独立线性子树的数目,一棵子树是一个有返回的调用序列。
就像圈复杂度是测试路径的数目,而集成复杂度是程序或其子系统的独立线性子树。
计算方法一个程序的集成复杂度和一个模块的圈复杂度是非常相似的,必须计算对程序进行完全测试所需集成测试的数目。
S1的计算公式:S1=S0-N+1N是程序中模块的数目。
优点有助于集成测试的实施;量化集成测试工作且反映了系统设计复杂度;有助于从整体上隔离系统复杂度。
Number of Lines (nl)行数行数是模块中总的行数,包括代码和注释。
优点:计算简单;与所用的高级程序设计语言类型无关;指出了模块的行数(即模块的规模),规模小的模块易于理解和维护。
Normalized Complexity (nv)规范化复杂度规范化复杂度是圈复杂度除以行数。
计算方法nv=v(G)/nl优点与所用的高级程序设计语言类型无关;定义那些有着显著判定逻辑密度的模块,这些模块相对于其他常见规范模块需要做更多的维护工作。
Global Data Complexity (gdv(G))全局数据复杂度全局数据复杂度(需有McCabe Data)量化了模块结构和全局数据变量的关系,它说明了模块对外部数据的依赖程度,同时度量了全局数据的测试工作,也描述了模块之间的耦合关系,能反映潜在的维护问题。
对于如何跟踪全局数据使用情况的更多信息,可以参考《McCabe Data in Using McCabe IQ Add-Ons》。
Specified Data Complexity (sdv(G))局部数据复杂度局部数据复杂度(需有McCabe Data)量化了模块结构和用户局部数据变量的关系,同时度量了局部数据的测试工作。
我们能够使用McCabe Data的数据字典选择单独的数据元素,指出每个数据元素具体的数据类型。
局部数据复杂度还提供了其他的数据选择准则,量化了每个模块中相应数据对模块控制结构的影响。
关于数据字典的更多信息,参考文档《McCabe Data in Using McCabe IQ Add-Ons.》。
Pathological Complexity (pv(G))病态数据复杂度病态数据复杂度衡量一个模块包含的完全非结构化成份的程度,标出向循环内部跳入的问题代码,而这些部分具有最大的风险度,通常需要重新设计。
计算方法所有的非结构部分除去向循环内跳入的结构,转化为线结构,病态复杂度就等于简化以后流程图的圈复杂度。