Klassen abhängigkeit ermitteln
-
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.
-
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.
-
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.