Hallo,
ich habe eine generelle Frage zur Entwicklung mit Qt. Gibt es grundsätzliche Herangehensweisen, um Zustandsänderungen und Abhängigkeiten übersichtlich an einer zentralen Stelle zu verwalten?
Ich arbeite an einem Programm, in dem Baumdiagramme gezeichnet und ausgewertet werden sollen. Eine einzelne Eingabe hat hier oft viele Veränderungen an mehreren Objekten zur Folge. Wie ein Objekt auf eine Eingabe reagiert, hängt aber meist noch von anderen Faktoren als der bloßen Eingabe ab. Außerdem ändert sich die Menge der vorhandenen Objekte und deren Typ ständig.
Derzeit ist mein Machwerk ein ziemliches Chaos von Signal-Slot-Verbindungen und Event-Routinen. Das muss eleganter und vor allem besser erweiterbar und wartbar werden.
Ich dachte daran, einen Singleton zu verwenden, den alle relevanten Objekte kennen. Dieser Singleton empfängt alle anfallenden Signale, mit denen Objekte Zustandsänderungen bekannt geben, wertet sie entsprechend der Programmlogik aus und bietet wiederum aufbereitete Signale an. Diese Signale können wiederum von allen Objekten empfangen werden. Die Verbindung mit Signals und Slots des Singleton ist Aufgabe der Objekte, das erledigen sie in ihrer Initialisierungsmethode. Somit müsste jedes Objekt nur wissen, was es zu melden hat und welche Meldungen es selbst braucht. Die Existenz anderer Objekte kann dem betreffenden Objekt quasi egal sein. Der Singleton müsste jeweils erweitert werden, wenn neue Objekte implementiert werden sollen.
Beispiel: Wenn Anwender auf einen Apfel klickt, soll dieser rot werden, alle anderen Äpfel grün. Äpfel, die einen Wurm enthalten sollen ihren Wurm jeweils an die nächstgelegene Birne weiter geben. Während die Würmer kriechen sind keine Änderungen am Diagramm möglich.
Hier würde der Apfel das Signal „Clicked“ senden, der Singleton daraufhin ein Signal „Apfel 1 clicked“. Alle Früchte und Würmer empfangen dieses Signal und reagieren entsprechend. Die Früchte ändern ihre Farbe (und signalisieren „Farbe geändert“), die Würmer senden „Wanderschafts-Mode“, woraufhin der Singleton „Wurmwanderschafts-Lockdown“ sendet usw.
Tatsächlich hat’s leider nix mit Obst und Würmern zu tun, aber ist kein schlechtes Beispiel…
Macht eine solche Lösung Sinn oder gibt es andere, bessere Ansätze, um so was zu machen?
Vielleicht kennt jemand Literatur zu dem Thema, die mich weiter bringt? Oder ein Stichwort für Google (außer Informatikstudium)?
Ich bin für jeden Hinweis dankbar!
Sinnvolle Modellierung mit Signals und Slots
Es gibt eine Gruppe von Äpfeln, von denen nur einer selektiert sein soll.
=> Die Gruppe kennt das selektrierte Element
=> Wird ein anderes Element ausgewählt, meldet es dieses Element an die Gruppe und die Gruppe meldet es an das bekannt Element zur deselektion weiter.
(s. QGraphicsScene)
Birnen: Wenn eine Animation begonnen wird, wird dies an die gemeinsame View gemeldet. Ebenso wenn eine Animation fertig ist.
=> Ist die Anzahl der animierten Elemente>0 können Eingaben angenommen werden, ansonsten nicht.
=> Nicht alles global abarbeiten, sondern auf Teilprobleme herrunterbrechen. Hat aber eigentlich nichts mit Qt zu tun, sondern allgemein mit Objektorientiertheit.
=> Die Gruppe kennt das selektrierte Element
=> Wird ein anderes Element ausgewählt, meldet es dieses Element an die Gruppe und die Gruppe meldet es an das bekannt Element zur deselektion weiter.
(s. QGraphicsScene)
Birnen: Wenn eine Animation begonnen wird, wird dies an die gemeinsame View gemeldet. Ebenso wenn eine Animation fertig ist.
=> Ist die Anzahl der animierten Elemente>0 können Eingaben angenommen werden, ansonsten nicht.
=> Nicht alles global abarbeiten, sondern auf Teilprobleme herrunterbrechen. Hat aber eigentlich nichts mit Qt zu tun, sondern allgemein mit Objektorientiertheit.