是否有一个自定义的FxCop规则将检测未使用的PUBLIC方法?
我刚试过FxCop。它会检测未使用的私有方法,但不会检测未使用的公共方法。是否有我可以下载的自定义规则,该插件将检测未从同一程序集中调用的公共方法?
解决方案
回答
NDepend是朋友,这种事情
回答
如何知道未使用公共方法?
通过将方法标记为公共方法,任何引用库的应用程序都可以访问该方法。
回答
如果未使用方法,并且公共FxCop假定我们已将其公开以供外部访问。
如果未使用的公共方法导致编写API的FxCop警告,那么我们可能会为打算供其他人使用的方法加载FxCop警告。
如果我们不需要外部任何东西来访问程序集/ exe,请考虑使用"内部"替换查找" public"。应用程序将以相同的方式运行,FxCop将能够找到未引用的内部方法。
如果确实需要外部访问,请找出真正需要哪些方法是外部的,然后将其余所有方法都设置为内部。
我们使外部可见的任何方法都可以进行单元测试。
回答
科里,我使用FxCop的答案假设我们有兴趣删除未使用的私有成员,但是要解决其他情况下的问题,我们可以尝试使用NDepend。这是一些CQL,用于检测未使用的公共成员(改编自下面列出的文章):
// <Name>Potentially unused methods</Name> WARN IF Count > 0 IN SELECT METHODS WHERE MethodCa == 0 AND // Ca=0 -> No Afferent Coupling -> The method // is not used in the context of this // application. IsPublic AND // Check for unused public methods !IsEntryPoint AND // Main() method is not used by-design. !IsExplicitInterfaceImpl AND // The IL code never explicitely calls // explicit interface methods implementation. !IsClassConstructor AND // The IL code never explicitely calls class // constructors. !IsFinalizer // The IL code never explicitely calls // finalizers.
来源:Patrick Smacchia的"耦合,死代码,设计缺陷和重新设计的代码度量。本文还介绍了检测死字段和类型的内容。
(编辑:使答案更容易理解)
编辑2012年6月11日:解释有关未使用代码的新NDepend工具。免责声明:我是该工具的开发人员之一。
自NDepend v4于2012年5月发布以来,该工具建议通过LINQ查询(CQLinq)编写代码规则。提出了大约200个默认代码规则,其中3个专用于未使用/死代码检测:
- 潜在失效的类型(因此检测未使用的类,结构,接口,委托...)
- 潜在失效的方法(因此检测未使用的方法,ctor,属性获取器/设置器...)
- 潜在的死亡领域
这些CQLinq代码规则比以前的CQL功能更强大。如果单击上面指向这些规则源代码的这3个链接,我们会发现有关类型和方法的链接有些复杂。这是因为它们不仅检测未使用的类型和方法,而且还检测仅由未使用的无效类型和方法(递归)使用的类型和方法。
这是静态分析,因此是规则名称中的潜在前缀。如果仅通过反射使用代码元素,则这些规则可能会将其视为未使用,情况并非如此。
除了使用这3条规则外,我建议我们通过测试来衡量代码覆盖率,并力争完全覆盖。通常,我们会看到测试无法涵盖的代码实际上是可以安全丢弃的未使用/死代码。这在复杂的算法中特别有用,在该算法中,不清楚代码的分支是否可访问。