在大型软件开发项目中,理解代码之间的相互引用关系对于进行有效的代码重构和影响分析至关重要。Visual Studio提供了一种方便的功能,允许开发者通过右键点击方法并选择 "FindAllReferences" 来列出所有直接调用该方法的方法。然而,在许多情况下,不仅需要知道直接调用者,还需要了解间接调用者,即所谓的 "N 阶引用"。例如,如果方法 Z 通过一系列调用最终调用了方法 A,那么了解这种关系对于决定是否需要重新测试方法 Z 就变得非常重要。
在大型项目中,仅仅知道方法 C 调用了方法 A 是不够的。需要更深入的视角,比如了解方法 Z 和方法 A 之间是否存在通过一系列调用的关联,例如 Z->Y->X->...->C->B->A。这种信息对于决定是否需要重新测试方法 Z 至关重要。
工具 "Reference Analysis" 是一个 SharpDevelop 插件,它安装在 SharpDevelop 3.0 上。它使用 SharpDevelop 库遍历打开的解决方案中的所有类的所有方法,并获取所有直接调用者 "First Order Caller"。这些信息存储在 XML 文件中,使用以下模式:
<Projects>
<Class>
<Method>
<Caller>...</Caller>
</Method>
</Class>
</Projects>
通过遍历解决方案中的所有方法并使用上述模式存储调用者,可以轻松查询以获取 "N 阶调用者" 的列表。
代码分为三个主要部分:
插件部分:这是使 SharpDevelop 能够识别该工具作为插件模块的代码。一个 SharpDevelop 插件可以由一个包含两个文件的 zip 文件组成:DLL 文件和 Addin 文件。DLL 文件包含所有代码和逻辑,而 .addin 文件是一个基于 XML 格式的文件,定义了插件对 SharpDevelop IDE 的属性。 Reference Analysis 插件是一个包含 FindReferences.addin 和 FindReferences.dll 的 zip 文件。
代码分析部分:这是工具的核心,是提取所有数据的地方。生成的数据可以保存为 XML 以供将来使用。
首先,工具从解决方案中提取项目,以便用户可以选择他们需要分析的项目。然后,项目开始分析这些项目中的每个方法,并追踪对解决方案中所有项目的调用。
显示部分:这个模块有一个独立版本,它使用保存的 XML 数据并显示它。尽管该工具对于小型项目来说运行速度很快,但在大型项目中生成所有方法的调用引用方法可能需要很长时间。为了避免经常运行这个任务,结果可以存储在 XML 格式中,并且可以稍后检索或分发给对结果感兴趣的不同开发人员。XML 结构代表了一个简单的数据库,包含三个表:References - Classes - Methods。可以在该 XML 上工作以提取更多信息。
安装并运行 Reference Analysis 插件:
运行 Reference Analysis 桌面版本:
从这个工具检索的数据提供了一个解决方案中 "什么调用什么" 的完整视图。这可以用于代码重构的影响分析研究。该工具将允许告诉哪些方法、类和项目受到影响或应该重新测试,作为重构给定方法的结果。