2009-01-28 67 views
4

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

你会如何为这种情况创建一个接口依赖用法树?代码库太大,无法简单地浏览Project Explorer并阅读源代码。你用什么工具或方法来创建这种依赖关系分析树?

我不想购买任何工具。像Visual Studio这样的Visual Studio工具似乎无法很好地处理这种大小的项目。我曾经想过编写我自己的sed/awk/perl-ish脚本,它只是简单地引导源代码并使用模式匹配来构建我自己的依赖/界面使用数据库,但是如果存在的话,我不想做一些困难的事情一个简单的方法。

谢谢!

回答

3

您可能应该购买类似NDepend的东西。

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

+0

如果您愿意,您可以使用免费试用版。 – ShuggyCoUk 2009-01-28 22:33:32

+0

+1,或许是唯一正确的答案,减去了那种尖刻的评论。 – user7116 2009-01-28 23:18:33

1

我知道你说你不想购买工具,但CodeRush是全功能和免费一个月(和只有250美元后,你得到重构亲!这是真棒)。它用一个非常漂亮的查找所有参考窗口来代替Shift + F12。

0

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

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

+0

2个问题: 1)当您谈论模块版本号时,是指DLL /程序集版本?这听起来像是当你发布一个新版本时尝试构建一个版本,然后一次一个地修复构建错误? 2)第二段中的工具是本土工具吗? 谢谢! – Todd 2009-01-28 22:05:36

+0

我们是一家Java商店,所以版本号非常随意。版本号位于模块的文件名中,如LoggingModule_1.01.01.jar。当有新版本的模块时,不会有构建错误,因为项目必须显式导入新版本。是的,它是在家种植的。 – 2009-01-29 14:44:45

1

直接依赖的简单解决方案,右键单击界面,然后选择“查找所有引用”。你也可以按照每种方法来做到这一点。

要找出多少代码中断作为更改的结果,您可以添加[Obsolete(true,“Testing the change”)]到您计划更改并触发重建的接口上的方法。这将导致一些部分无法建立。 如果您觉得这是对该课程的小改动,并且您可以修复该课程而不会对此课程的用户产生任何影响,请跳过这些部分并标记为[Obsolete(false,“Limited Change”)]如果您认为改为这会给班级的消费者带来重大问题,您可以将其标记为[废弃(真实,“Cascade”)],并处理后果。

最终,您的解决方案将完全建立,否则您将会出现如此多的错误,以至于显而易见的是,这种变化如此具有侵略性,唯一真正能够处理效果的方法是开始尝试真正的。

这种方法的好处是,您可以在不需要实际处理的情况下进行级联处理,只需要对其进行处理,然后粗略评估是否会触发相应的更改。一旦你感到高兴,你已经映射出了变化,你有一个现成的警告列表,在你IDE中去和改变当你改变接口本身(和构建真的失败)。

这依赖于不把警告视为错误,你可能不得不暂时放松你建立设置。

在全新的源代码更新中完成所有这些操作,以便您可以在需要重试时将部件回滚。

+0

好的提示。但是,这更像是一种“蛮力”的方法。我希望能够在编译/构建之前找到一种方法来查看所有依赖关系。 – Todd 2009-01-29 14:16:08

1

就像一个提示:当你要建立你自己的版本的这样的工具,你也可以使用反射在编译的程序集上做到这一点。

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

(注:你也不想用反射直接得到的是集依赖于动态加载的组件,例如装载虽然Assembly.Load你将不得不实行特殊处理,如果这是用在你的项目。)

2

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

一个与这个问题有关的人 - 他的经理不会支付一个分析器,所以他们花了5个开发人员的时间来优化程序的错误部分。使用探查器,他在半天内找到并解决了问题。