Im ersten Beitrag NDepend: Tool zur statischen Code-Analyse wurden einige Grundlagen des Tools NDepend beschrieben. NDepend ist ein Tool zur statischen Code-Analyse. Dabei analysiert NDepend den Quellcode auf Basis verschiedener Abfragen (z.B. Lines of Code (LOC) oder die Anzahl von Methoden innerhalb einer Klasse) und Code-Regeln. Mit Hilfe von Code-Regeln lassen sich definierte Eigenschaften von Quelltext (und deren Einhaltung) überprüfen. Abfragen und Code-Regeln werden in einer NDepend spezifischen Sprache namens CQLinq definiert. Wie der Name bereits vermuten lässt basiert das Ganze auf LINQ, was die Einarbeitung erheblich vereinfacht. Das Erstellen und Editieren eigener Code-Regeln und die Anpassung der ebenfalls in CQLinq implementierten, mitgelieferten Regeln bringt eine hohe Flexibilität. Wie man eigene Abfragen und Code-Regeln erstellen kann wird jetzt in diesem Beitrag erklärt.
Von Haus aus bringt NDepend über 200 solcher Abfragen und Code-Regeln mit, die in verschiedene Kategorien wie Design, Architektur und Namenskonventionen eingeteilt sind. Die einzelnen Kategorien sind über das Hauptmenü erreichbar:
Einstiegspunkt für das Erstellen und Editieren der Abfragen und Code-Regeln ist der „Queries and Rules Explorer“:
Wie im Screenshot zu sehen sind die Abfragen und Code-Regeln in einzelnen Kategorien organisiert. Die Kategorien sind frei konfigurierbar und es besteht die Möglichkeit eigene Kategorien anzulegen. Wird im „Queries and Rules Explorer“ ein Eintrag ausgewählt öffnet sich ein entsprechender Editor. Dort können die Abfragen und Code-Regeln editiert und ausgeführt werden. Das Ergebnis wird dann direkt unter der jeweiligen Abfrage angezeigt:
Kommen wir nun zu der NDepend spezifischen Abfragesprache CQLinq.
Grundlagen CQLinq
Um jetzt eigene Abfragen in CQLinq definieren zu können benötigt man zunächst eine entsprechende Datengrundlage. Dafür bringt NDepend vordefinierte Domänen mit. So eine Domäne kann man sich als Datencontainer (z.B. vorhandene Methoden oder Felder) vorstellen, auf welche Abfragen definiert werden können. Standardmäßig stehen die folgenden Domänen zur Verfügung:
- Types (entspricht: IEnumerable<IType>)
- Methods (entspricht: IEnumerable<IMethod>)
- Fields (entspricht: IEnumerable<IField>)
- Namespaces (entspricht: IEnumerable<INamespace>)
- Assemblies (entspricht: IEnumerable<IAssembly>)
Daneben gibt es noch weitere vordefinierte Domänen: Application und ThirdParty. Wie der Name hier bereits vermuten lässt werden diese Domänen verwendet, um Code-Elemente die nur innerhalb der eigenen Code-Basis oder nur in Third-Party Assemblies (wie mscorlib.dll, System.dll oder Prism.dll) definiert sind abzufragen. Darüber hinaus gibt es noch die Domäne JustMyCode, welche versucht generierten Quellcode aus den Abfrageergebnissen auszuschließen (z.B. generierter Quellcode von einem UI-Designer). Hier nochmal in der Übersicht:
- Application – hier wird nur Quellcode der eigenen Code-Basis bzw. der eigenen Assemblies untersucht
- ThirdParty – hier werden nur Third-Party Assemblies (wie mscorlib.dll, System.dll oder Prism.dll) untersucht
- JustMyCode – hier wird versucht generierten Quellcode aus den Abfrageergebnissen auszuschließen (z.B. generierter Quellcode von einem UI-Designer)
Auf Basis dieser Domänen ist es nun möglich eigene Abfragen zu definieren.
Benutzerdefinierte Abfragen
Wie bereits erwähnt basiert CQLinq auf LINQ und somit ist die erste Abfrage auch schnell geschrieben. Hier mal ein paar einfache Beispiele:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// Alle Methoden mit mehr als 30 Zeilen // sowohl in der eigenen Code-Basis als auch in Third-Party Assemblies from m in Methods where m.NbLinesOfCode > 30 select m // Alle Methoden innerhalb der eigenen Code-Basis mit mehr als 30 Zeilen from m in Application.Methods where m.NbLinesOfCode > 30 select m // Alle Methoden mit einer zyklomatischen Komplexität größer als 10 // innerhalb eines bestimmten Namespaces from m in Application.Namespaces.WithNameLike("ProductName.FeatureA").ChildMethods() where m.CyclomaticComplexity > 10 select m // Methoden, die nicht generiert wurden from m in JustMyCode.Methods where m.NbLinesOfCode > 30 select m |
Wie zu sehen sind die Abfragen leicht zu schreiben und zu lesen. Jeder der schon einmal mit LINQ gearbeitet hat sollte hier schnell handlungsfähig sein (zumal der eingebaute Editor IntelliSense unterstützt und via ToolTip nützliche Hinweise gegeben werden):
Enthält die Abfrage Fehler werden diese in einer Übersicht dargestellt (ähnlich dem Übersichtsfenster in Visual Studio, so dass man sieh hier schnell zurechtfindet):
Weitere Informationen zur CQLinq-Syntax sind hier zu finden: http://www.ndepend.com/docs/cqlinq-syntax
Informationen zu weiteren Sprachfeatures werden hier erläutert: http://www.ndepend.com/docs/cqlinq-features
Mit den bereitgestellten Hilfsmitteln lassen sich Abfragen sehr einfach und intuitiv erstellen. Vor allem die enge Anlehnung an LINQ ermöglicht eine schnelle Einarbeitung, so dass die ersten Abfragen in Kürze definiert sind. Hat man eine Abfrage geschrieben ist der Weg zur ersten selbst definierten Code-Regel nicht mehr weit.
Benutzerdefinierte Code-Regeln
Eine CQLinq-Abfrage kann recht einfach in eine Code-Regel umgewandelt werden. Dafür werden der Abfrage die beiden CQLinq Schlüsselwörter warnif count vorangestellt. Dabei repräsentiert count einen Integerwert, der die Anzahl der gefundenen Code-Elemente angibt. Somit könnte eine Code-Regel wie folgt aussehen:
1 2 3 4 5 |
// <Name>Avoid too large methods</Name> warnif count > 0 from m in Application.Methods where m.NbLinesOfCode > 30 select m |
Somit wäre die Definition einer Code-Regel auch schon fertig. Jetzt liegt es am Team Code-Regeln zu definieren, die den geforderten Richtlinien entsprechen. Verstöße gegen Code-Regeln werden direkt bei der Ausführung angezeigt:
Darüber hinaus besteht die Möglichkeit Code-Regeln als kritisch einzustufen. Ist NDepend in den Build-Prozess integriert kann der Build-Prozess so konfiguriert werden, dass der Build bei Verstoß gegen eine kritische Code-Regel scheitert. Eine Code-Regel kann wie folgt als kritisch definiert werden:
Eine Übersicht über Code-Regel Verstöße erhält man über das Dashboard oder den generierten Report:
Weitere Hinweise bzgl. Validierung von Code-Regeln sind hier zu finden: http://www.ndepend.com/docs/validating-cqlinq-code-rules-in-visual-studio
Fazit
NDepend bringt mit CQLinq alles mit um schnell und intuitiv eigene Abfragen und Code-Regeln erstellen zu können. Vor allem die enge Anlehnung an LINQ erleichtert den Einstieg ungemein. Hier liegt es dann ganz am Entwicklungsteam entsprechende Abfragen und Code-Regeln zu definieren und festzulegen welche Regeln unternehmensweit oder projektbezogen eingesetzt werden sollen.
Literaturverzeichnis und Weblinks
Abk. | Quelle |
---|---|
[1] | NDepend NDepend |
[2] | NDepend Standard-Regeln http://www.ndepend.com/default-rules/webframe.html |
[3] | NDepend CQLinq Syntax http://www.ndepend.com/docs/cqlinq-syntax |
[4] | NDepend CQLinq Features http://www.ndepend.com/docs/cqlinq-features |
[5] | NDepend Validation Code Rules http://www.ndepend.com/docs/validating-cqlinq-code-rules-in-visual-studio |
Login