依赖图

使用 CppDepend 依赖关系图解读代码复杂性

CppDepend 提供了广泛的功能,通过交互式依赖关系图、依赖结构矩阵和代码查询功能来帮助用户探索现有代码架构。

入门视频 (3分钟)

感谢以下合作:

  • 交互式依赖图
  • 依赖结构矩阵
  • 交互式代码查询的可能性
  • Visual Studio 代码编辑器窗口右键菜单中可用的菜单
  • Visual Studio 解决方案资源管理器右键菜单中可用的菜单

……CppDepend 提供了广泛的功能来帮助用户探索现有代码架构。在本文中,您将学习如何利用这些功能来实现最常见的代码探索场景。

依赖图

默认情况下,CppDepend 依赖关系图面板显示项目之间的依赖关系图:

项目之间的依赖图

您可以选择一个项目,通过右键菜单,CppDepend 提供探索命名空间之间依赖关系图的功能。

命名空间之间的依赖图

并且对于每个命名空间,CppDepend 提供探索该命名空间中类型之间依赖关系图的功能。

命名空间中各类型之间的依赖关系图

通过右键菜单,CppDepend 还提供探索某个类型的成员(方法 + 字段)之间依赖关系图的功能。

成员之间的依赖图

回到顶部

Call Graph

CppDepend 可以通过两步过程生成您需要的任何调用图。

  • 首先:请求类型、字段、方法、命名空间或项目的直接和间接调用者/被调用者。其效果是生成以下 CQLinq 查询,以匹配所有请求的调用者或被调用者。调用图请注意,在 CQLinq 查询结果中,指标 DepthOfIsUsing/DepthOfIsUsedBy 显示使用深度(1 表示直接,2 表示通过直接使用者的使用等等……)。CQLinq 查询可以很容易地修改为仅匹配具有特定使用深度条件的间接调用者/被调用者。另请注意,所请求的调用者/被调用者不一定与相关代码元素属于同一种类。例如,这里我们请求直接或间接使用某个类型的方法。
  • 第二:一旦 CQLinq 查询匹配了用户希望的调用者/被调用者集合,匹配结果集就可以导出到依赖关系图。其效果是显示所需的调用图。调用图

回到顶部

类继承图

要显示继承类图,必须应用上一节(关于生成调用图)中所示的相同两步过程。

  • 首先:生成一个 CQLinq 查询,请求继承自特定类(或实现特定接口)的类集合。这里会生成以下 CQLinq 查询:继承
  • 第二:将 CQLinq 查询结果导出到依赖关系图,以显示所需的继承图。继承

回到顶部

耦合图

可能需要确切知道哪些代码元素参与了特定的依赖关系。特别是当需要预测结构变更的影响时。在下面的屏幕截图中,CppDepend Info 面板描述了两个项目之间的耦合。

指向依赖矩阵中的一个单元格,表示项目 A 的 X 个类型正在使用项目 B 的 Y 个类型。请注意,您可以更改选项 单元格权重# 方法, # 成员# 命名空间,如果您需要了解与类型以外的事物的耦合。

耦合1

只需左键单击矩阵单元格即可显示下方的耦合图。

耦合2

耦合图也可以从依赖关系图中的一条边生成。在这里,您可以调整选项 边粗细 改为其他 # 类型.

耦合3

回到顶部

路径图

如果您想深入探究两个代码元素之间的路径或依赖循环,首先要做的是使用以下选项显示依赖矩阵 单元格权重: 直接和间接使用深度.

矩阵的蓝色和绿色单元格将表示 路径 而黑色单元格将表示 依赖循环 例如,这里的 Info 面板告诉我们,所涉及的 2 个类型之间存在一条最小长度为 7 的路径。

路径1

只需左键单击单元格即可显示下方的路径图。

路径2

回到顶部

所有路径图

在某些情况下,您需要了解从代码元素 A 到代码元素 B 的所有路径。例如,这里的 Info 面板告诉我们,涉及的两个类型之间存在一条最小长度为 2 的路径。

所有路径1所有路径2

最后,将 CQLinq 查询匹配的 12 个类型导出到图中,显示从 A 到 B 的所有路径。

所有路径3

回到顶部

循环图

正如我们在上一节中所解释的,要处理依赖循环图,首先要做的是使用以下选项显示依赖矩阵 单元格权重: 直接和间接使用深度。黑色单元格表示循环。

例如,这里的 Info 面板告诉我们,所涉及的 2 个类型之间存在一个最小长度为 5 的依赖循环。

依赖循环1

只需左键单击单元格即可显示下方的循环图。

依赖循环2

我们要提醒您,获得如上图所示的干净“圆形”依赖循环实际上更多是例外情况而非常规。

通常,展示一个循环最终会得到一个像下面这样不“圆”的图。在这个例子中,涉及的两个类型(黄色)之间的循环最小长度为 12。数一下从一个黄色类型到另一个黄色类型所经过的边数,你会得到 12。你会发现有些边会被计算多次。

依赖循环3

回到顶部

使用依赖结构矩阵可视化的大型图

在这里,我们想强调这样一个事实:当依赖关系图变得难以阅读时,切换到依赖矩阵是值得的。

依赖关系图和依赖矩阵共存的原因:

  • 依赖关系图很直观,但当节点之间的边太多时会变得难以阅读。
  • 依赖矩阵需要时间来理解,但一旦掌握,您就会发现 依赖矩阵在探索现有架构时比依赖关系图高效得多.

有关依赖矩阵可读性的更多信息,请参见 一眼识别代码结构模式

为了说明这一点,下面通过依赖关系图和依赖矩阵展示了 77 个命名空间之间相同的依赖关系。

大图大矩阵

回到顶部

立即试用 CppDepend

开始 14 天免费试用,畅享全部文档功能。无需信用卡。