Klassen abhängigkeit ermitteln



  • Hi Leute.

    Ich stehe vor folgendem Problem und habe leider bis jetzt keinen Treffer bei Google gefunden. Entweder es gibt nicht viele Lösungen für das Problem oder ich benutze die falschen Suchbegriffe.

    Folgendes. Ich schreibe gerade an einem Programm, welches hierarchischen Testabläufe erstellen soll. Man gibt also eine Klasse an die getestet werden soll und das Programm ermittelt einen Graphen, der die Abhängigkeit der Klasse und der anderen Klassen dar stellt. So soll das Programm von den Klassen ohne Abhängigkeit aus den Graphen testen um Fehler und Folgefehler zu ermitteln.

    Gibt es eine Lösung für die Ermittlung der Abhängigkeiten einer Klasse? Den Graphen selber werde ich dann mit der Boost Graph Library erstellen. Wie ich aber an die Abhängigkeiten selber komme weiß ich leider nicht.

    Es wäre eine Möglichkeit die Klassenstruktur vorher händisch zu erstellen aber das Programm soll davon unabhängig sein und die Klassenstruktur müsste laufend gepflegt werde, was ich verhindern will.

    Ich hoffe ihr könnt mir da weiter helfen.

    Grüße. Fo3r5ter


  • Mod

    Verstehe ich recht, du möchtest C++ parsen? Auch wenn dies allgemein extrem schwer ist, so sollte es in diesem Fall doch recht einfach sein: Da die Basisklaasen alle bekannt sein müssen, kannst du den Präprozessor nachbauen (oder das Original verwenden) und dich dann in der Klassenhierarchie nach oben hangeln. Viele Programme können dies auch schon (z.B. doxygen), es ist nur die Frage die Daten in das von dir benötigte Format zu bekommen. Aufgrund der vielfältigen Einstellungsmöglichkeiten dürfte es sogar möglich sein das genannte doxygen (welches eigentlich für etwas ganz anderes da ist) für diesen Zweck zu missbrauchen.



  • Nehmen wir an wir haben eine Klasse A und eine Klasse B.

    Die Klasse B soll z.b. ein Objekt von der Klasse A besitzen oder dort eine Methode aufrufen. Dann soll, wenn ich die Klasse B testen will zuerst die Klasse A testen. Um aber das doppelte Testen von Klassen zu verhindern will ich zuerst einen Graphen mit Boost aufbauen. Boost hat Methoden um dieses Problem zu verhindern und wurde in dem Projekt das ich testen will schon mal verwendet. Doxygen sagt mir vom Namen her was aber da muss ich mich was schlauer machen.

    Habe gerade noch ein paar Infos zu Reflection und Metaklassen gefunden. Damit kann man wohl auch die Struktur eines Programms ermitteln und wiederherstellen aber ich steige da noch nicht ganz durch.

    Das Projekt das getestet werden soll ist genau wie mein Programm in C++ geschrieben.

    Zum testen verwende ich momentan das CppUnit Framework. Ich kann auch schon einzelne von Hand gewählte Klassen testen will aber die Funktion weiter automatisieren.

    Danke schon mal für die schnelle Antwort.

    Fo3r5ter



  • Fo3r5ter schrieb:

    Habe gerade noch ein paar Infos zu Reflection und Metaklassen gefunden.

    C++ unterstützt keine Reflection. Entweder du registrierst die Klassen von Hand, oder du nimmst irgendein Tool, das Klassenbeziehungen aus dem Code ableiten kann.



  • Angeblich gibt es eine Boost::Reflection. Habe die Informationen von hier. http://de.nntp2http.com/comp/lang/iso-c++/2009/05/ccf1b2e67472073a3c80bb290fe9a015.html

    Der Nutzer will das zwar für einen anderen Sinn nutzen aber angeblich kann man das für mein Problem auch nutzen.

    Die Informationen direkt aus dem Code zu Interpretieren hatte ich mir auch schon als Idee beiseite gelegt. Man müsste nach den #import Einträgen suchen und gucken welche der Klassen zu denen gehören, die getestet werden sollen. Wollte aber erst sichergehen ob es da nicht eine bessere Patentierte Lösung gibt.

    ...

    Fo3r5ter



  • Du meinst wohl #include?



  • @ Pi: Ähhhh ja klar. Sorry. Keine Ahnung wie ich jetzt bei Java gelandet bin.



  • Fo3r5ter schrieb:

    Angeblich gibt es eine Boost::Reflection.

    Nicht als offizielle Boost-Bibliothek, siehe hier. Vielleicht ist was in Entwicklung. Trotzdem ändert eine Bibliothek nichts an der Tatsache, dass du in C++ für Reflection die Programmstruktur manuell angeben musst oder auf externe Tools angewiesen bist. Das Sprachmittel existiert nicht (u.A. weil es zu viele Nachteile für zu wenig Nutzen bringt und sich nicht besonders gut in C++ integriert).

    Übrigens könntest du dir auch mal die Bibliothek CAMP anschauen, die geht ebenfalls in die Richtung.



  • Eine Frage. Wie kommt der Compiler an die Abhängigkeiten der Klassen? Immerhin prüft dieser ja auch welche Klassen wie zusammen hängen und verknüpft die Header Dateien.


  • Mod

    Fo3r5ter schrieb:

    Eine Frage. Wie kommt der Compiler an die Abhängigkeiten der Klassen? Immerhin prüft dieser ja auch welche Klassen wie zusammen hängen und verknüpft die Header Dateien.

    Nein, umgekehrt. Die Headerdateien verknüpft der Programmierer, der Präprozessor wertet diese Verknüpfungen aus und dann kann der Compiler die Abhängigkeiten der Klassen direkt ablesen. Der Compiler sieht nur

    class A
    {
     // ...
    };
    
    // ...
    
    class B: public A
    {
     // ...
    };
    


  • Nur #include beachten wird gut.
    Dran denken, daß nur *.cpp getestet werden können.
    Jede Foo.cpp ist von der passenden Foo.hpp abhängig.

    Darüberhinaus vermute ich:
    Um einen Header zu testen, kommt man nicht umhin, alle *.cpp zu testen, die diesen Header inkludieren.
    Man sollte stets die *.cpp testen, die am meisten Headers fertigmacht.



  • Benutze doch einfach DoxyGen, das erfasst Dir die Abhängigkeiten und erstellt sogar einen Graph.

    http://www.stack.nl/~dimitri/doxygen/



  • Ich habe ein ähnliches Problem mal mit dem DIA SDK gelöst. Allerdings müsstest du dafür Visual Studio benutzen. Mit dem Framework kannst du aus den im Debug Modus erstellten *.pdb Dateien alle Klassen auslesen, mit Basisklassen usw. Ist allerdings COM und recht fumlig.


Anmelden zum Antworten