NDepend: Abfragen und Code-Regeln mit CQLinq

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:

Code-Regeln Kategorien

Code-Regeln Kategorien

Einstiegspunkt für das Erstellen und Editieren der Abfragen und Code-Regeln ist der „Queries and Rules Explorer“:

Queries and Rules Explorer

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:

Query and Rules Edit

Query and Rules Edit

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:

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):

IntelliSense (Autovervollständigung)

IntelliSense (Autovervollständigung)

Enthält die Abfrage Fehler werden diese in einer Übersicht dargestellt (ähnlich dem Übersichtsfenster in Visual Studio, so dass man sieh hier schnell zurechtfindet):

Fehlerübersicht

Fehlerübersicht

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:

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:

Verstoß gegen eine Code-Regel

Verstoß gegen eine Code-Regel

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:

Kritische Code-Regel

Kritische Code-Regel

Eine Übersicht über Code-Regel Verstöße erhält man über das Dashboard oder den generierten Report:

NDepend Dashboard

NDepend Dashboard

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

leave your comment

Fork me on GitHub