【问题标题】:How to restrict NDepend methods query on type attribute如何限制对类型属性的 NDepend 方法查询
【发布时间】:2011-01-23 15:45:37
【问题描述】:

我试图让 NDepend 使用标准“方法太大”查询的修改版本来识别长方法。

我不想报告开发人员几乎无法控制的长方法,因此我使用DebuggerNonUserCode 属性和InitializeComponent() 过滤掉生成的代码。

不幸的是,我仍然得到一些误报,因为生成类型中的方法也会被报告。问题是,虽然类型本身具有 DebuggerNonUserCode 属性,但方法没有,因此尽管它们是生成的,但它们仍包含在输出中。

我正在寻找类型和方法之间的连接之类的东西:给我所有没有 DebuggerNonUserCode 属性的类型并在这些类型上运行查询,但我不知道如何在 CQL 中表达这一点。

对于某些程序集,我可以简单地过滤全名,但不幸的是,我们的一些程序集混合了开发人员制作和生成的类型。不幸的是,IsGeneratedByCompiler 在这种情况下也不能使用。

我的查询

WARN IF Count > 0 IN SELECT METHODS WHERE 
   NbLinesOfCode > 30 AND
   !HasAttribute "System.Diagnostics.DebuggerNonUserCodeAttribute" AND
   !NameIs "InitializeComponent()"
   ORDER BY NbLinesOfCode DESC

【问题讨论】:

  • 我找不到任何一种方法来加入方法和输入信息,甚至 V3 的发行说明也没有提到这一点。
  • 你试过 IsGeneratedByCompiler 方法属性吗?
  • @Timores:没错,我希望我能将两者结合起来。我还没有看过 IsGeneratedByCompiler。从文档来看,它似乎没有起到作用。但无论如何我都会试一试并更新问题。
  • 我已经向 NDepend 的支持发送了一个请求。当我得到一些东西时,我会更新评论或发布答案。

标签: c# ndepend cql cqlinq


【解决方案1】:

Brian,感谢Code Rule over LINQ Query (CQLinq)您要求的代码规则的源代码是:

warnif count > 0
from m in Application.Methods where
  m.NbLinesOfCode > 30 &&
 !m.ParentType.HasAttribute( "System.Diagnostics.DebuggerNonUserCodeAttribute") &&
  m.Name != "InitializeComponent()"
orderby m.NbLinesOfCode descending
select new { m, m.NbLinesOfCode }

CQLinq 语法还提供了一种定义Just-My-Code 的方法。此功能描述为here。基本上,您需要通过以 notmycode 为前缀的查询来定义集合 JustMyCode。那么你要求的规则可以很容易地重写:

warnif count > 0
from m in JustMyCode.Methods where
   m.NbLinesOfCode > 30
orderby m.NbLinesOfCode descending    
select new { m, m.NbLinesOfCode }

一次性定义的 JustMyCode 集可以在任何代码规则上重复使用。另外,您可以查看 notmycode 默认查询 Discard generated and designer Methods from JustMyCode

【讨论】:

    【解决方案2】:

    我非常喜欢 NDepend,但它仍然是最大的单一缺点,即命名空间/类型/方法信息无法连接到单个查询中。该功能将使 CQL 成为真正强大的东西。

    除此之外,检查“IsGeneratedByCompiler”和“IsInFrameworkAssembly”可能会有所帮助。 您还可以从查询中删除某些命名空间 (OUT OF NAMESPACES "...")

    【讨论】:

    • 肯定会的!我知道 OUT OF 功能,但不幸的是,相关程序集将开发人员制作的代码和生成代码都集中在同一个命名空间中:(
    • flq,Brian,看看我上面的回答:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多