圈复杂度查看器






4.29/5 (11投票s)
2005年6月17日
5分钟阅读

117399

2767
一个圈复杂度查看器应用程序。
- 下载 VS.NET 2003 演示项目 - 108 Kb
- 下载 VS.NET 2003 源代码 - 55.2 Kb
- 下载 VC++ 6 演示项目 - 43.5 Kb
- 下载 VC++ 6 源代码 - 53.5 Kb
引言
圈复杂度度量[1]“衡量单个软件模块中决策逻辑的数量”[2]。在我的实现中,我将软件模块视为一个函数。圈复杂度“完全基于软件控制流图的结构”[2]。使用控制流图计算每个函数的圈复杂度的公式为
其中 E 和 N 分别是控制流图中的边数和节点数。 图 1 显示了 C++ 语言中存在的控制结构(`for` 除外)的控制流图。我对圈复杂度度量的理解是,它衡量一个函数有多复杂,这决定了测试该特定函数有多容易。
|
|
|
if | if/else | while |
|
|
|
do | switch |
图 1. 控制流图
背景
经过近五年的努力,我终于发布了这个插件。你可能会问,为什么是五年?好吧,在找到并实现了一个显示有向图的算法、改进了程序、然后发现了 Graphviz、丢失了所有源代码并重新开始之后,我花了这么长时间。对于插件的 VC++ 6 版本,我使用了 Norm Almond 的 CLabel 类。在 VS.NET 2003 版本中,我使用了 Rashid Thadha 的 ATL 版本的 CLabel 类。
安装插件
VS.NET 2003
下载 CCMetricViewer_DLL.zip 文件后
- 使用文件夹名称提取文件。
- 双击 ReCreateCommands.reg 文件以注册插件。安装后,工具栏上应出现以下按钮:
。
- 如果没有出现任何内容,请单击 工具 菜单项,然后从下拉菜单中选择 插件管理器...。将出现 插件管理器 对话框。现在确保同时选中 可用插件 和 启动 的复选框。工具栏现在应该会出现。
- 还可以查看“视图\工具栏”菜单项,然后从列表中选择“度量查看器”。
- 如果仍然没有出现任何内容,请尝试 devenv.exe /setup。
VC++ 6
下载 VC6_DLL.zip 文件后
- 使用文件夹名称提取文件。
- 单击 工具 菜单项,然后从下拉菜单中选择 自定义...。将出现 自定义 对话框。单击 插件和宏文件 选项卡。选中标记为 圈复杂度查看器插件 的复选框以启用它。
- 将出现以下按钮
警告
此插件目前有很多错误。它存在许多仍需修复的问题。下面是问题列表
- 它无法解析以下形式的源代码
if (A) D;
或
if (B) {C};
但是它将能够解析以下形式的源代码
if (A) D;
或
if (B) {C}
- 对话框中的列表显示在操作滚动条时不会自动更新。它只会在通过垂直滚动条向下滚动列表时才自行更新。
使用加载项
VS.NET 2003
这两个按钮都用于计算圈复杂度度量,但是计算出的矩阵是
respectively.
特定函数
第一个按钮用于当你想要找出特定函数的圈复杂度度量时。只需选择特定函数并单击按钮。如图 图 2(a) 和 2(b) 所示,将显示一个包含函数名称及其特定度量的对话框。如果度量值大于 10,则值以红色显示,否则以黑色显示。
![]() |
![]() |
图 2(a)。小于 10 | 图 2(b)。大于 10 |
图 2。选定特定函数的度量
解决方案中的所有函数
第二个按钮将计算当前加载的解决方案中所有(全局和成员)函数的圈复杂度矩阵。只需单击按钮。如图 图 3 所示,将显示一个对话框,其中包含一个列表控件,其中包含解决方案中的所有函数及其各自的矩阵。图 3。已加载解决方案的所有矩阵(单击此处放大)
除了列表之外,该对话框还包含一些可用于操作数据的控件。
图 4 显示了用于设置度量级别以进行比较的控件。最初设置为默认值 10。许多人建议将 10 作为默认级别,以此来比较函数的圈复杂度矩阵。任何度量值高于 10 的函数都被认为过于复杂,需要分解为更小的函数。下表提供了一些想法
1-10 | - | 一个简单的程序 |
11-20 | - | 更复杂 |
21-50 | - | 复杂 |
> 50 | - | 不可测试[3] |
所有度量值高于当前设置的度量级别的函数将在列表中突出显示。 图 5 显示了将插件应用于当前加载的解决方案,然后将度量级别设置为 5 的结果。
图 4。默认度量级别 10 |
图 5。度量级别设置为 5(单击此处放大) |
图 6 显示了“导出”按钮,可用于将列表中显示的結果导出到预命名的 XML 文件。
图 6。将结果导出到 XML 文件
XML 文件具有以下格式
<solution name="">
<project name="">
<class name="">
<file name="">
<function name="">
<path name=""></path>
<metric></metric>
</function>
</file>
</class>
</project>
<project name="">
...
</project>
...
</solution>
VC++ 6
VC++ 6 版本的插件只能确定单个函数的圈复杂度度量。通过突出显示特定函数的代码来选择该函数。然后单击插件按钮,将出现一个如图 图 7 所示的对话框,显示度量值。如果度量值大于 10,则值以红色显示,否则以黑色显示。
图 7。特定选定函数的度量值
反馈
我将非常感谢任何评论、建议,尤其是如果它能帮助我修复 警告 部分所述的问题。
参考文献和进一步信息
- McCabe, T., "A Complexity Measure", IEEE Transactions on Software Engineering, December 1976.
- 结构化测试:使用圈复杂度度量的测试方法
- 圈复杂度
历史
- 2005 年 6 月 24 日 - 添加了 VC++ 6 版本的相关文件并更新了文章。
- 2005 年 6 月 17 日 - 首次公开发布。