NDepend 5.4.1 があり、可視性が低くなる可能性のあるフィールド/タイプ/メソッドのクエリを変更したいと考えています。クエリを違反と見なすかどうかを決定する際に、囲んでいるクラスのスコープを考慮に入れる必要があります。
例えば、
internal class X
{
public int A;
public void B() { }
public class C
{
// …
}
}
A、B、または C が、いずれかを内部にする必要があるという違反を生成することは望ましくありません。一方、クラス X が public で、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)
一見すると、いくつかのテストを実行した後、これは正しいことをしているように見えます。私の質問は、これが誤検知を生成するか、違反を見逃すかどうかです。列挙型の可視性の順序付け (比較) がすべての場合に正しいことを行うかどうかわからないためです。