我试图让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
有帮助吗?

解决方案

布赖恩,由于编码规则在LINQ查询(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语法还提供了一种方法来定义什么是的只是-MY-代码的。此功能描述这里。基本上需要定义该组的 JustMyCode 通过查询前缀的 notmycode 即可。然后,你所要求的规则可以被轻易改写:

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

该组的 JustMyCode 一旦所有可在任何编码规则被重用定义。 Additionaly你可以看看在 notmycode 默认查询丢弃产生和从JustMyCode设计师方法

其他提示

我很喜欢NDepend的,但它仍然是最大的单一缺点命名空间/类型/方法的信息不能被加入到一个单一的查询。该功能将使CQL真正强大的东西。

除此之外支票 ' IsGeneratedByCompiler ' 和 ' IsInFrameworkAssembly ' 可以是有帮助的。 您也可以从查询卸妆一定的命名空间(命名空间OUT “......”的)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top