我们有 NDepend 5.4.1,我们想要更改可能具有较低可见性的字段/类型/方法的查询。我们希望查询在决定是否将其视为违规时考虑封闭类的范围。
例如,
internal class X
{
public int A;
public void B() { }
public class C
{
// …
}
}
我们不希望 A、B 或 C 产生违规,说它们中的任何一个都应该是内部的。另一方面,如果类 X 是公共的,并且 A、B 和 C 都没有在程序集之外使用,那么它们都应该产生违规。
为此,我在查询中添加了以下行:
// consider visibility of enclosing class
f.ParentType.Visibility < f.OptimalVisibility
因此对于字段,新查询如下所示:
// <Name>Fields that could have a lower visibility</Name>
warnif count > 0 from f in JustMyCode.Fields where
f.Visibility != f.OptimalVisibility &&
!f.HasAttribute("NDepend.Attributes.CannotDecreaseVisibilityAttribute".AllowNoMatch()) &&
!f.HasAttribute("NDepend.Attributes.IsNotDeadCodeAttribute".AllowNoMatch()) &&
// consider visibility of enclosing class
f.ParentType.Visibility < f.OptimalVisibility
select new { f,
f.Visibility ,
CouldBeDeclared = f.OptimalVisibility,
f.MethodsUsingMe }
我以类似的方式更改了方法可见性和类型可见性的查询,除了类型我确保有一个封闭的父类型:
(t.ParentType == null || t.ParentType.Visibility < t.OptimalVisibility)
乍一看,在运行了一些测试之后,这似乎是在做正确的事情。我的问题是这是否会产生任何误报或错过任何违规行为,因为我不确定枚举可见性排序(比较)是否在所有情况下都会做正确的事情。