发现接口依赖性

我接管了一个非常大的(> 2M SLOC)软件项目的维护,所有这些都是用C#编写的。 文档很少。 我现在想要对具有公共接口(大约400)的模块进行更改,但我不知道解决方案中的所有其他模块(总共大约50个)可能正在使用此公共接口。

如何为这种情况创建接口依赖性使用树? 代码库太大,无法简单地导航Project Explorer并阅读源代码。 您使用了哪些工具或方法来创建此类依赖性分析树?

我不想购买任何工具。 诸如Class View之类的Visual Studio工具似乎不能很好地处理这种大小的项目。 我已经考虑过编写自己的sed / awk / perl-ish脚本,它只是简单地遍历源代码并使用模式匹配来构建我自己的依赖/接口使用数据库,但是如果有的话,我不想做一些艰难的事情。一个简单的方法。

谢谢!

你可能应该买像NDepend这样的东西。

如果有另一个提供类似价值的免费工具,我会推荐它。 但是,我真的相信NDepend是你最好的选择。 使用这样大小的代码库,400美元的工具不会花费很长时间来为自己付费。

我认真地建议找到一个现有的工具来做到这一点。 你永远不可能手动整理整个东西,使用工具节省的时间肯定会支付工具本身的成本。

一个与之合作的人有这个问题 – 他的经理不会为分析器付费,因此他们花了5个开发人员日来优化程序的错误部分。 使用剖析器,他在半天内发现并修复了问题。

我知道你说你不想购买工具但是CodeRush可以全function免费使用一个月(之后只需250美元,你就得到了重构专家!这太棒了)。 它用一个非常漂亮的查找所有引用窗口取代了Shift + F12。

直接依赖的简单解决方案,右键单击界面并选择“查找所有引用”。 您也可以基于每个方法执行此操作。

要了解更改后代码会中断多少,您可以将[已过时(true,“测试更改”)]添加到您计划更改和触发重建的接口上的方法。 这将导致某些部分无法构建。 如果您认为这是对该类的一个小改动,并且您可以修复它而不会对此类的消费者产生任何影响,请跳至这些部分并使用[Obsolete(false,“Limited Change”)]标记它们,如果您认为这样做会给类的消费者带来重大问题,你可以将其标记为[已废弃(真实,“级联”)]并处理影响。

最终你的解决方案将完全构建,否则你将会遇到很多错误,很明显变化是如此具有侵略性,以至于真正掌握效果的唯一方法就是开始尝试真实。

这种方法的好处是你可以进行级联,而无需实际处理它如何处理它,只需要你需要并粗略评估它是否会触发随之而来的变化。 一旦你高兴你已经映射了更改,你在IDE中有一个现成的警告列表,当你改变界面时(并且构建确实失败),你可以改变它。

这依赖于不将警告视为错误,您可能必须暂时放松构建设置。

在新的源代码更新中执行所有这些操作,以便在您想再次尝试时可以回滚部件。

正如提示:当您要构建自己的此类工具版本时,您也可以使用reflection在已编译的程序集上执行此操作。

.NET为您提供加载程序集和查询System.Reflection命名空间中的所有接口,类型,方法和属性所需的一切。 这样你就不必担心使用sed / awk / perl自己解析源代码了(因为你需要解析命名空间和inheritance,这不是一件容易的事)。

(注意:你不能直接使用reflection的是程序集依赖于动态加载的程序集,例如通过Assembly.Load加载。如果你在项目中使用它,你将不得不实现一个特殊的处理)

我不知道你的项目是如何设置的,但是我们每个模块都有一个版本号。 当我们需要对模块进行更改时,我们会创建一个新版本。 想要使用新接口的客户端代码链接到更新的模块并删除对旧项目的引用。 使用不同的版本,更改API不会产生意外的副作用; 客户端代码必须明确地做某事。

此外,我们有一个实用程序(以某种方式)爬过所有项目和报告,如果它们中的任何一个使用的模块不是最新版本。 检查(即使使用Microsoft VSS!)哪些项目引用了过时的模块也很容易。