发现接口依赖性

时间:2009-01-28 20:26:27

标签: c# interface dependencies

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

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

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

谢谢!

6 个答案:

答案 0 :(得分:3)

您可能应该购买类似NDepend的内容。

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

答案 1 :(得分:2)

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

一个与之合作的人遇到了这个问题 - 他的经理不会为分析器付费,因此他们花了5个开发人员时间来优化程序的错误部分。使用剖析器,他在半天内找到并解决了问题。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

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

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

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

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

答案 4 :(得分:1)

就像一个提示:当你打算构建自己的这种工具版本时,你也可以使用反射在已编译的程序集上执行此操作。

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

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

答案 5 :(得分:0)

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

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