( Verwandte SO-Frage .)
Bedenken Sie, dass es eine sehr große Klassenhierarchie gibt, von Dutzenden oder sogar Hunderten von Klassen. Das Vererbungsdiagramm ist auch sehr komplex (doxygen kann es ohne halbseitengroße Pfeile nicht darstellen :-) ). Und hier kommt das gefürchtete Diamantproblem. Ich suche nach einem Weg, alle Diamanten zu finden.
Etwa so:
Hier müssen die rot markierten Vererbungspfeile virtuell sein. In einer so einfachen Struktur ist es leicht, alle zu finden, aber nicht in einer viel größeren.
Das Finden aller Diamanten scheint ein leicht automatisierbares Graph-Walking-Problem zu sein. Es würde mich wundern, wenn es nicht schon eine Lösung für die Aufgabe gäbe.
Die Frage ist bereits ein Tool für eine Aufgabe vorhanden?
Sie haben zwei Probleme zu lösen:
Der erste Teil ist komplex, da das Parsen von C++ zum genauen Abrufen dieser Vererbungsinformationen schwierig ist (C++ selbst ist wahnsinnig schwer zu parsen, dann haben Sie die Komplikationen von Präprozessorbedingungen, Include-Dateien, Makros und Vorlagen). Dazu benötigen Sie ein vollständiges C++-Frontend und einen organisierten Angriff, um die Vererbungsinformationen zu sammeln.
Unser DMS Software Reengineering Toolkit mit seinem C++-Frontend kann verwendet werden, um diese Art von Informationen zu extrahieren. Sie können DMS so konfigurieren, dass es alle Ihre Kompilierungseinheiten analysiert und eine Namens-/Typauflösung durchführt; Dies übernimmt die gesamte Vorverarbeitung / Vorlagenauflösung und erzeugt für jede Kompilierungseinheit sowohl ASTs für das Programm (die Sie für diese Aufgabe nicht benötigen) als auch zugängliche Symboltabellen, die Deklarationen von Klassen und gewünschten A-Vererbungen enthalten -von-B-Informationen. Ein einfacher Symboltabellen-Scan kann die Vererbungsinformationen für jede Kompilationseinheit erzeugen.
Anschließend müssen Sie diese Informationen zusammenstellen, um ein Vererbungsdiagramm für Ihr System zu erhalten. Es sollte offensichtlich sein, dass Sie den Vererbungsgraphen buchstäblich erstellen möchten.
Mit diesem Diagramm ist die Entdeckung von Diamanten im Grunde einfach:
Sie können diesen Diamond-Finder mit anderer Software als DMS implementieren, aber Sie könnten auch die interne prozedurale Programmiersprache von DMS verwenden, wodurch der Schritt vermieden würde, der die Vererbungsinformationen exportiert.
Zusammenfassung:
Da DMS das Produkt meines Unternehmens ist, verstehen Sie dies nicht als Empfehlung, sondern lediglich als Hinweis, dass DMS existiert und die Aufgabe von OP erfüllen kann.
Sie können auch CppDepend ausprobieren , das viele Funktionen bezüglich der Abhängigkeiten und eine Code-Abfragesprache bietet, um Ihre Abhängigkeitsregeln einfach zu erstellen.
Thomas Weller
Steve Barnes
Peterh