2016-06-07 32 views
2

Als Geschäftsregel verbieten wir die Verwendung eines spezifischen Namensraums innerhalb dieses anderen Namensraums.Ist es in C# für einen Komponententest oder eine Codeanalyse möglich, festzustellen, ob ein Namespace in einer Klasse verwendet wird?

Beispiel:

using X.A; //Allowed 
using X.B; //Not allowed 

namespace X.C 
{ 
    const string abc = X.A.MyClass.ABC; //Allowed 
    const string def = X.B.MyClass.DEF; //Not allowed, because we are using X.B 

    public void MyMethod() 
    { 
     string ghi = X.A.MyClass.GHI; //Allowed 
     string jkl = X.B.MyClass.JKL; //Not allowed because we are using X.B 
     string mno = "X.B.MyClass.MNO"; //Allowed, because we are not accessing X.B 
    } 
} 

Ist es möglich, dies mit einem Unit-Test zu steuern, über Code-Analyse, oder beides, so dass wir leichter diese Geschäftsregel durchsetzen können, anstatt sich auf Code-Review unter Berufung, die kann diese Art von Sache leicht verpassen? Angenommen, es ist möglich, wie würden Sie das machen?

+4

Was ist der Zweck einer solchen Regel? Das scheint nicht wirklich nützlich zu sein. Warum entfernen Sie nicht einfach die Assembly-Referenz? – poke

+0

Unit-Tests dienen zur Überprüfung von _results_, nicht _implementation_. Die Codeanalyse könnte wahrscheinlich verwendet werden, um diese Verwendung zu erkennen. Wenn Sie nun fragen möchten, wie es geht, fügen Sie das bitte zu Ihrer Frage hinzu und spezifizieren Sie _wich_ Code-Analyse-Tool, das Sie verwenden möchten. –

+1

Zwei oder mehr Assemblys können dieselbe Namespacehierarchie verwenden. Sie können 'X.A' in eine DLL und' X.B' in eine andere einfügen. Aber wirklich, die Kontrolle des Zugriffs nach Namespace ist peinlich und Sie werden das Werkzeug bekämpfen, um es am Laufen zu halten. –

Antwort

2

Eine solche Regel ist mit dem Werkzeug NDepend that let's write code rule through C# LINQ queries und check such rules live in Visual Studio und in your Build Process möglich.

Konkret solche Regel könnte wie folgt aussehen:

warnif count > 0 from n in Namespaces where 
n.IsUsing ("NUnit.Core.Extensibility") && 
(n.Name == @"NUnit.Core.Builders") 
select new { n, n.NbLinesOfCode } 
// the namespace NUnit.Core.Builders 
// shouldn't use directly 
// the namespace NUnit.Core.Extensibility 
// because (TODO insert your reason) 

... und diese Regel bearbeitet und ausgeführt werden können/Live in Visual Studio erzwungen. NDepend Namespace Rule Edited in Visual Studio

Eigentlich kann man einen solchen Code Regel mit einem einzigen Klick von der dependency graph oder aus dem dependency matrix erzeugen:

NDepend Dependency Graph

Eine solche Regel Regel kann auch in Komponententests geschrieben und durchgesetzt werden, da NDepend bietet und API.

Das könnte Sie auch interessieren: white books concerning structuring code through namespaces and assemblies.

Haftungsausschluss: Ich arbeite für NDepend.