65.9K
CodeProject 正在变化。 阅读更多。
Home

圈复杂度查看器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.29/5 (11投票s)

2005年6月17日

5分钟阅读

viewsIcon

117399

downloadIcon

2767

一个圈复杂度查看器应用程序。

Metric Level set at 5

引言

圈复杂度度量[1]“衡量单个软件模块中决策逻辑的数量”[2]。在我的实现中,我将软件模块视为一个函数。圈复杂度“完全基于软件控制流图的结构”[2]。使用控制流图计算每个函数的圈复杂度的公式为

E - N + 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 文件后

  1. 使用文件夹名称提取文件。
  2. 双击 ReCreateCommands.reg 文件以注册插件。安装后,工具栏上应出现以下按钮:
  3. 如果没有出现任何内容,请单击 工具 菜单项,然后从下拉菜单中选择 插件管理器...。将出现 插件管理器 对话框。现在确保同时选中 可用插件启动 的复选框。工具栏现在应该会出现。
  4. 还可以查看“视图\工具栏”菜单项,然后从列表中选择“度量查看器”。
  5. 如果仍然没有出现任何内容,请尝试 devenv.exe /setup

VC++ 6

下载 VC6_DLL.zip 文件后

  1. 使用文件夹名称提取文件。
  2. 单击 工具 菜单项,然后从下拉菜单中选择 自定义...。将出现 自定义 对话框。单击 插件和宏文件 选项卡。选中标记为 圈复杂度查看器插件 的复选框以启用它。
  3. 将出现以下按钮

    Button

警告

此插件目前有很多错误。它存在许多仍需修复的问题。下面是问题列表

  1. 它无法解析以下形式的源代码
    if (A) D;

    if (B) {C};

    但是它将能够解析以下形式的源代码

    if (A)
       D;

    if (B)
       {C}
  2. 对话框中的列表显示在操作滚动条时不会自动更新。它只会在通过垂直滚动条向下滚动列表时才自行更新。

使用加载项

VS.NET 2003

这两个按钮都用于计算圈复杂度度量,但是计算出的矩阵是

respectively.

特定函数

第一个按钮用于当你想要找出特定函数的圈复杂度度量时。只需选择特定函数并单击按钮。如图 图 2(a) 和 2(b) 所示,将显示一个包含函数名称及其特定度量的对话框。如果度量值大于 10,则值以红色显示,否则以黑色显示。

图 2(a)。小于 10 图 2(b)。大于 10

图 2。选定特定函数的度量

解决方案中的所有函数

第二个按钮将计算当前加载的解决方案中所有(全局和成员)函数的圈复杂度矩阵。只需单击按钮。如图 图 3 所示,将显示一个对话框,其中包含一个列表控件,其中包含解决方案中的所有函数及其各自的矩阵。

Solution's metrices

图 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。特定选定函数的度量值

反馈

我将非常感谢任何评论、建议,尤其是如果它能帮助我修复 警告 部分所述的问题。

参考文献和进一步信息

  1. McCabe, T., "A Complexity Measure", IEEE Transactions on Software Engineering, December 1976.
  2. 结构化测试:使用圈复杂度度量的测试方法
  3. 圈复杂度

历史

  • 2005 年 6 月 24 日 - 添加了 VC++ 6 版本的相关文件并更新了文章。
  • 2005 年 6 月 17 日 - 首次公开发布。
© . All rights reserved.