Abhängigkeitsgraph
Code-Komplexität entschlüsseln mit dem CppDepend-Abhängigkeitsgraphen
CppDepend bietet eine breite Palette an Möglichkeiten, um Benutzer beim Erkunden einer bestehenden Codearchitektur zu unterstützen – durch interaktive Abhängigkeitsgraphen, Dependency Structure Matrices und Codeabfragemöglichkeiten.
Erste-Schritte-Video (3 Min.)
Dank der Zusammenarbeit mit:
- Ein interaktiver Abhängigkeitsgraph
- Eine Dependency Structure Matrix
- Möglichkeiten der interaktiven Codeabfrage
- Menüs in den Rechtsklick-Menüs des Visual-Studio-Code-Editor-Fensters
- Menüs in den Rechtsklick-Menüs des Visual-Studio-Projektmappen-Explorers
...CppDepend bietet eine breite Palette an Möglichkeiten, um Benutzer beim Erkunden einer bestehenden Codearchitektur zu unterstützen. In diesem Artikel erfahren Sie, wie Sie von diesen Funktionen profitieren, um die beliebtesten Code-Exploration-Szenarien umzusetzen.
Abhängigkeitsgraph
Standardmäßig zeigt das CppDepend-Abhängigkeitsgraph-Panel den Graphen der Abhängigkeiten zwischen Projekten:

Sie können ein Projekt wählen, per Rechtsklick-Menü bietet CppDepend an, den Graphen der Abhängigkeiten zwischen Namespaces zu erkunden.

Und für jeden Namespace bietet CppDepend an, den Graphen der Abhängigkeiten zwischen den Typen eines Namespace zu erkunden.

Und per Rechtsklick-Menü bietet CppDepend an, den Graphen der Abhängigkeiten zwischen den Membern (Methoden + Felder) eines Typs zu erkunden.

Call Graph
CppDepend kann jeden benötigten Aufrufgraph mit einem zweistufigen Verfahren generieren.
- Zuerst: Fragt nach direkten und indirekten Aufrufern/Aufgerufenen eines Typs, eines Felds, einer Methode, eines Namespaces oder eines Projekts. Der Effekt ist, dass die folgende CQLinq-Abfrage generiert wird, die alle angefragten Aufrufer oder Aufgerufenen trifft.
Beachten Sie, dass im CQLinq-Abfrageergebnis die Metrik DepthOfIsUsing/DepthOfIsUsedBy zeigt die Nutzungstiefe (1 bedeutet direkt, 2 bedeutet über einen direkten Nutzer usw...). Die CQLinq-Abfrage kann leicht geändert werden, um nur indirekte Aufrufer/Aufgerufene mit einer bestimmten Bedingung zur Nutzungstiefe zu finden. Beachten Sie auch, dass die angefragten Aufrufer/Aufgerufenen nicht unbedingt von derselben Art wie das betreffende Codeelement sein müssen. Hier fragen wir beispielsweise nach Methoden, die einen Typ direkt oder indirekt verwenden. - Zweitens: Sobald die CQLinq-Abfrage die gewünschte Menge von Aufrufern/Aufgerufenen trifft, kann die Ergebnismenge in den Abhängigkeitsgraphen exportiert werden. Dies bewirkt, dass der gewünschte Aufrufgraph angezeigt wird.

Klassenvererbungsgraph
Um einen Vererbungsklassen-Graphen anzuzeigen, muss dasselbe zweistufige Verfahren angewendet werden, das im vorherigen Abschnitt (zum Generieren eines Aufrufgraphen) gezeigt wurde.
- Zuerst: Generiert eine CQLinq-Abfrage, die nach der Menge der Klassen fragt, die von einer bestimmten Klasse erben (oder eine bestimmte Schnittstelle implementieren). Hier wird die folgende CQLinq-Abfrage generiert:

- Zweitens: Exportieren Sie das Ergebnis der CQLinq-Abfrage in den Abhängigkeitsgraphen, um den gewünschten Vererbungsgraphen anzuzeigen.

Kopplungsgraph
Es kann nötig sein, genau zu wissen, welche Codeelemente an einer bestimmten Abhängigkeit beteiligt sind. Besonders wenn man die Auswirkungen einer strukturellen Änderung vorhersehen muss. Im Screenshot unten beschreibt das CppDepend-Info-Panel eine Kopplung zwischen 2 Projekten.
Das Zeigen auf eine Zelle in der Abhängigkeitsmatrix besagt, dass X Typen eines Projekts A Y Typen eines Projekts B verwenden. Beachten Sie, dass Sie die Option ändern können Gewicht auf Zelle zu # Methoden, # Mitglieder oder # Namespaces, wenn Sie die Kopplung mit etwas anderem als Typen kennen müssen.

Ein einfacher Linksklick auf die Matrixzelle zeigt den Kopplungsgraphen unten.

Ein Kopplungsgraph kann auch aus einer Kante im Abhängigkeitsgraphen generiert werden. Hier können Sie die Option Kantendicke auf etwas anderes als # Typ.

Pfadgraph
Wenn Sie einen Pfad oder einen Abhängigkeitszyklus zwischen zwei Codeelementen untersuchen möchten, besteht der erste Schritt darin, die Abhängigkeitsmatrix mit der Option anzuzeigen Gewicht auf Zellen: Direkte & indirekte Verwendungstiefe.
Blaue und grüne Matrixzellen stellen dar Pfade während schwarze Zellen darstellen Abhängigkeitszyklen Zum Beispiel sagt uns hier das Info-Panel, dass es einen Pfad der Mindestlänge 7 zwischen den 2 beteiligten Typen gibt.

Ein einfacher Linksklick auf die Zelle zeigt den Pfad-Graphen unten.

Alle-Pfade-Graph
In bestimmten Situationen müssen Sie alle Pfade von einem Codeelement A zu einem Codeelement B kennen. Hier sagt uns beispielsweise das Info-Panel, dass es einen Pfad der minimalen Länge 2 zwischen den beiden beteiligten Typen gibt.


Schließlich zeigt der Export der 12 von der CQLinq-Abfrage gematchten Typen in den Graphen alle Pfade von A nach B.

Zyklengraph
Wie im vorherigen Abschnitt erläutert, besteht der erste Schritt beim Umgang mit Abhängigkeitszyklusgraphen darin, die Abhängigkeitsmatrix mit der Option anzuzeigen Gewicht auf Zellen: Direkte & indirekte Verwendungstiefe. Schwarze Zellen stellen dann Zyklen dar.
Zum Beispiel sagt uns hier das Info-Panel, dass es einen Abhängigkeitszyklus der Mindestlänge 5 zwischen den 2 beteiligten Typen gibt.

Ein einfacher Linksklick auf die Zelle zeigt den Zyklus-Graphen unten.

Wir möchten darauf hinweisen, dass ein sauberer „abgerundeter“ Abhängigkeitszyklus wie der oben gezeigte tatsächlich eher eine Ausnahme als die Regel ist.
Oft führt das Darstellen eines Zyklus zu einem nicht 'abgerundeten' Graphen wie dem unten gezeigten. In diesem Beispiel beträgt die minimale Länge eines Zyklus zwischen den beiden beteiligten Typen (in Gelb) 12. Zählen Sie die Kanten, die von einem gelben Typ zum anderen durchlaufen werden, und Sie erhalten 12. Sie werden sehen, dass einige Kanten mehrfach gezählt werden.

Großer Graph, visualisiert mit der Dependency Structure Matrix
Hier möchten wir betonen, dass es sich lohnt, zur Abhängigkeitsmatrix zu wechseln, wenn der Abhängigkeitsgraph unlesbar wird.
Abhängigkeitsgraph und Abhängigkeitsmatrix existieren nebeneinander, weil:
- Der Abhängigkeitsgraph ist intuitiv, wird aber unlesbar, sobald zu viele Kanten zwischen Knoten existieren.
- Die Abhängigkeitsmatrix braucht Zeit, um verstanden zu werden, aber einmal gemeistert, werden Sie sehen, dass ist die Abhängigkeitsmatrix viel effizienter als der Abhängigkeitsgraph, um eine bestehende Architektur zu erkunden.
Weitere Informationen zur Lesbarkeit der Abhängigkeitsmatrix finden Sie in Codestrukturmuster auf einen Blick identifizieren
Zur Veranschaulichung finden Sie unten dieselben Abhängigkeiten zwischen 77 Namespaces — dargestellt durch Abhängigkeitsgraph und Abhängigkeitsmatrix.


Testen Sie CppDepend noch heute
Starten Sie Ihre 14-tägige kostenlose Testversion mit vollem Zugriff auf alle Dokumentationsfunktionen. Keine Kreditkarte erforderlich.
