Ein Weg aus dem Include-Chaos (Visual Studio mit IncludeManager)
Sebastian Pohl - 26. Februar 2014Bilder in diesem Artikel wurden mit dem IncludeManager von ProFactor Software gemacht.
Gerade bei Projekten, in denen mehrere Entwickler mit unterschiedlichen Programmierstilen und -erfahrungsleveln zusammenarbeiten, passiert es häufiger, dass die Include-Reihenfolge der unterschiedlichen Programmteile immer undurchsichtiger und verstrickter wird. Meistens merkt man auch erst dann, dass die Struktur vielleicht überarbeitungswürdig ist, wenn es bereits zu spät ist.
Problematisch wird es dann, wenn man über mehrere Includes quasi im Kreis gearbeitet hat und immer wieder auf Probleme stöß,t die aus diesen zirkulären Abhängigkeiten entstehen. Dazu kommt, dass die Übersichtlichkeit stark leidet, wenn die gleichen Dateien immer wieder inkludiert werden, obwohl die Funktionalität eigentlich schon auf anderem Weg eingeholt wurde.
Die Struktur eines Projektes, an dem ich beteiligt bin ist im einführenden Bild auf der linken Seite zu sehen. Blau sind die .cpp Dateien, Rot die Header und Grün sind Systembibliotheken. Wie man deutlich sehen kann, ist das Ganze sehr unübersichtlich und durcheinander. Viele Dateien werden mehrfach und an verschiedenen Stellen eingebunden, einige kreisförmige Includeschleifen gibt es auch.
Als kleiner Spoiler an dieser Stelle: Auf der rechten Seite im Bild ist die gleiche Struktur nach dem „Aufräumen“.
Aber wie löst man jetzt dieses Chaos auf? Ohne weitere Tools zur Hilfe zu nehmen ist das ziemlich aufwändig. Man kann versuchen das ganze per Hand zu machen und die Struktur aufzuzeichen. Allerdings kann das je nach Projektgröße mehr oder weniger aussichtslos werden. Ein Tool, dass die Struktur als Diagramm anzeigen kann erleichtert die Sache enorm. Ist man MSDN Abonnent, dann kann man seit einiger Zeit ein Feature Pack für Visual Studio herunterladen, dass eine entsprechende Erweiterung enthält.
Hat man nicht dieses Vergnügen, bleiben dennoch einige Optionen offen, so kann man zum Beispiel mit Doxygen und graphviz zumindestens eine grafische Repräsentation erhalten. Schöner wird es mit dem IncludeManager. Dieser integriert sich in Visual Studio und bietet eine interaktive Ansicht der Struktur.
Oben ist bereits gezeigt, wie die Übersicht über ein vollständiges Projekt aussehen kann, hier sieht man dann auch, dass man für eine einzelne Datei die Abhängigkeitsstruktur anzeigen lassen kann.
Da die Übersicht bei vielen Dateien mit unübersichtlichen Includes leicht leiden kann, bietet das Tool mehrere Funktionen, die das Auffinden und Lösen von Problemen erleichtern.
Die erste Hilfe ist der Mouseover-Effekt für die Verbindungen. Geht man mit der Maus über einen der Pfeile, wird er blau eingefärbt und ist leichter zu verfolgen. Klickt man den Pfeil an, gelangt man zur Datei die die Ressource am Pfeilende beansprucht.
Die zweite Funktion lässt sich mit einem Rechtsklick auf einen beliebigen Dateinamen im Graph und der Auswahl von „Show Include Paths“ aufrufen. Dadurch wird rekursiv angezeigt, welche anderen Dateien diese Datei includieren und wo die Inhalte dadurch verfügbar sind. Alle Elemente, die dadurch Zugriff erhalten sind mit rot eingefärbten Pfeilen verbunden. Gerade für das Auffinden zirkulärer Abhängigkeiten ist das extrem praktisch.
Mit dem IncludeManager ist das „Aufräumen“ zwar nicht automatisch erledigt, aber die Arbeit ist sehr viel einfacher und übersichtlicher geworden.
Die elegantere Variante wäre natürlich, von vorn herein sauber zu strukturieren, leider klappt das nicht immer. 🙂
Hallo,
Sie sprechen mir aus der Seele. Aber das include-chaos fängt ja bereits ganz am Anfang an und die eigenen Includes vergößern nur das Chaos, wenn man eine Konsequenz in der eigenen Struktur nicht gefunden hat. Aber wenn man sich die Basis ansieht, dann ist es eher verwunderlich wenn man eine eigene klare Strutur basierend auf den Vorgaben überhaupt aufbauen kann.
Genau das, was schreiben entspricht meiner Erfahrung. Nun habe ich ja doch noch Hoffnung das irgendein Stein so ins Rollen kommt, daß einmal Verbesserungen spürbar werden. Letztlich würde ich mir eine Oberfläche wünschen, auf der automatisch oder manuell ‚angekreuzt’/eingegeben wird, auf welcher Plattform man selber arbeitet und für welche Plattform die Ausgabe bestimmt ist. … Schön wäre auch wenn z.B. make-files so in eine Oberfläche importiert werden könnten, daß ein Ablauf problemloser möglich wird. Oft habeich mich auch gefragt, ob nicht aus einer Datenbank heraus das ganze Abhängigkeits-Chaos aufgelöst werden könnte. Haben Sie schon einmal irgendeinen Hinweis gesehen oder bekommen, ob derartiges auf GCC-Basis existiert oder in Entwicklung ist? Selber habe ich früher viel mit VCPP 6.0 garbeitet, bin aber auf der Linux-Ebene bei Codeblocks gelandet. Aber der Include-Wahnsinn ist hier auch noch nicht gelöst …. .Momentan hänge ich auch wieder in einem anspruchsvollem Projekt und verliere mit dem Strukturieren und Aufräumen des vorhandenen Codes (fast) unvorstellbar viel Zeit ….. .
Jedenfalls merci für Ihre reflektierte und verbalisierte Bebeobachtung!
Grüße
Dietmar Oertel