benötige Denkanstoss OOD

Hmmm, ich komm grad einfach nicht dahinter wie man sowas sauber macht.

Also folgendes:
In meiner Studienarbeit will ich Algorithmen visualisieren, dazu schreibe ich eine Art Compiler, also eher einen Interpreter der meine Quellsprache in einen Objektbaum umwandelt, den ich dann zur Ausführungszeit abarbeite.

Nun weiss ich aber nicht wie ich die Verbindung zur Darstellung hinbekomme. Ich habe da nun einen Baum, an dem ich irgendwo an der Wurzel einsteige und dann rekursiv durchgehe, möchte aber nicht den Code zur Visualisierung dort reinpacken sondern dass dies irgendwie woanders steht, aber wie mach ich das?

Ich denke momentan daran irgendwie ein Interface zu definieren, dass eine Art Listener darstellt… dann rufe ich bei jedem Knoten in meinem Baum eine Funktion auf, die den aktuellen Knoten an alle registrierten Listener übergibt und diese schauen dann ob sie was zu tun haben, z.b. eine Animation durchführen (bei einem Sortieralgorithmus zwei Zahlen austauschen oder sowas).

Ist das ein gebräuchlicher Weg oder was könnte man sonst machen? Was mir insbesondere nicht gefällt ist, dass ich z.b. in der Funktion evaluate() oder wie auch immer ich die nenne im Knoten ich dann jedesmal auch ein Listeners.handle(this) oder sowas in der Richtung einbauen müsste, einmal vergessen und alles is am A…

Ich hoffe das war so einigermassen verständlich was meine Fragestellung ist :wink:
Ich muss also quasi in diesen Rekursionsablauf eingreifen um Informationen für andere Aufgaben (Visualisierung) abzurufen (so ne Art Abgreifen von Debug Information zur Laufzeit).

Gruß
Bruno

Falls es zur Verdeutlichung hilft, ich brauche z.b. auch noch folgendes… bei der Abarbeitung des Programmcodes in meinem Baum will ich auch noch die Zeile im Sourcecode markieren, dazu muss ich ja auch irgendwie die Zeilennummer die ich bei den Objekten im Baum irgendwie hinterlege an eine Funktion übergeben, die mir die entsprechende Zeile markiert und zwar bei jedem Objekt.

Ist das ein gebräuchlicher Weg oder was könnte man sonst
machen?

Hört sich IMHO gut an.

Es gibt ein XML-Parser-API das so arbeitet (ich kann das nie auseinanderhalten, aber ich glaube es ist SAX).

Was mir insbesondere nicht gefällt ist, dass ich z.b.
in der Funktion evaluate() oder wie auch immer ich die nenne
im Knoten ich dann jedesmal auch ein Listeners.handle(this)
oder sowas in der Richtung einbauen müsste, einmal vergessen
und alles is am A…

Du meinst, weil es verschiedene Implementierungen für die Knoten gibt?

Eigentlich ist diese evaluate()-Funktionalität doch allgemein und könnte in eine abstrakte Basisklasse für die Knoten, oder?

Falls nicht, dann könntest du in der Basisklasse eine abstrakte Methode evalutateCustom() o. ä. einbauen. Die evaluate()-Methode benachrichtigt die Listener, ruft die evaluateCustom()-Methode und dann die evaluate()-Methode aller Children-Nodes auf.

In der evaluateCustom()-Methode bauen dann die Ableitungen ihre verschiedenen Evaluierungsmechanismen ein.

Um das ganze anzustossen brauchst du nur die evaluate()-Methode der Root-Node aufzurufen.

Grüße, Robert