Wie am besten GUI von Programmlogik trennen?
-
Hallo,
in der eigentlichen Programmlogik benötige ich gelegentlich mal Zugriff auf die in der GUI enthaltenen Widgets, um z.B. mal ein Control zu deaktivieren, oder einen Text zu ändern. Um dies zu realisieren, habe ich es prinzipiell für eine gute Idee gehalten, entsprechende Getter-Methoden zu implementieren, die die entsprechend benötigten Instanzen der Widgets zurück geben. Allerdings würde sich so die Menge der benötigten get-Methoden hochsummieren, was einen zu großen Aufwand bedeuten würde.
Deshalb habe ich als zweite Methode vorgeschlagen, einfach alle Widget-Instanzen private in eine Struktur zu packen, und dann mit einer einzigen Methode nur dieses Struct zurückzugeben. So spart man sich den Aufwand für die ganzen einzelnen get-Methoden.
Nur bin ich mit dieser Lösung nach wie vor nicht sehr zufrieden... gibt es da eine bessere Alternative?
Danke!
-
-
MVC ist die Lösung für die Überschrift, aber nicht für die Frage im Text. Da bietet sich das Observer Pattern an.
-
http://www.henkessoft.de/C++/C++ Fortgeschrittene/C++_Fortgeschrittene.htm#3.1._Observer
Hier kannst Du mal einen Blick darauf werfen.
-
Vielen Dank für die Antworten. Das erste Schlagwort "MVC" hat mich gestern bereits zum Observer-Pattern geführt, bis ich in diesem Thread meine Bestätigung dazu gefunden habe. Hier auf c-plusplus.net gibt es einen prima Artikel dazu.
Das Observer-Pattern habe ich grundlegend verstanden, nur tue ich mich bei der konkreten, projektbezogenen Umsetzung noch etwas schwer. Wenigstens weiß ich jetzt, wie der gängige Lösungsweg aussieht.
Erhard: Danke Dir, werde ich mir gleich durchlesen.
-
FragendeFrage schrieb:
Vielen Dank für die Antworten. Das erste Schlagwort "MVC" hat mich gestern bereits zum Observer-Pattern geführt, bis ich in diesem Thread meine Bestätigung dazu gefunden habe. Hier auf c-plusplus.net gibt es einen prima Artikel dazu.
Das Observer-Pattern habe ich grundlegend verstanden, nur tue ich mich bei der konkreten, projektbezogenen Umsetzung noch etwas schwer. Wenigstens weiß ich jetzt, wie der gängige Lösungsweg aussieht.
Erhard: Danke Dir, werde ich mir gleich durchlesen.
wikipedia bietet hier auch einen guten Artikel mit Code-Beispiel. Das sollte dir einen Anreiz für deinen ersten konkreten Ansatz geben:
-
Danke! Ich überlege gerade, wie ich das Update jeweils auf mehrere GUI-Elemente des Observers übertragen kann. Angenommen, die Programmlogik möchte nun irgendein Label des GUI ändern. Hierzu müsste man natürlich nur eine entsprechende Update-Methode definieren, die dann das gewünschte Element ändert. Allerdings möchte ich nicht nur auf dieses einzige Label beschränkt sein... ich möchte z.B. auch mal irgendein anderes Widget ändern.
Dazu müsste ich aber differenzieren können, welches Element nun geupdatet werden soll. Als möglichen Lösungsweg hatte ich mir gedacht, könnte man der Update-Methode eine entsprechende selbst definierte Konstante übergeben, die angibt, welches Element geändert werden soll. Durch eine interne Fallunterscheidung innerhalb der Update-Methode könnte man dann darauf reagieren.
Nur ist das auch wieder mit großen Wartungsaufwand verbunden, und stellt für mich keine zufriedenstellende Lösung dar... Was soll ich da machen?
-
push
-
Hm. Also meiner Meinung nach ist es falsch, wenn die Programmlogik Teile des Views ansprechen oder ändern kann. Nach MVC ist das View dazu da, um Daten der Programmlogik anzuzeigen und Befehle des View-Benutzers an die Logik weiterzureichen. Das dient ja dazu, dass View und Logik entkoppelt sind. Das View könnte also auch einfach eine Konsolen-View sein, in der der Benutzer Befehle für die Programmlogik eintippt. Von daher finde ich es definitiv falsch, dass die Programmlogik Widgets oder irgendwelche Textlabels kennt.
Der Umgang mit den Elementen der View ist also die Aufgabe des Views und nicht der Logik.Klar kann die Logik Update-Nachrichten an das View schicken, aber halt nur allgemein, also in der Form "Hey, ich hab lange umgerechnet, bin jetzt aber fertig".
Gleich 'ne Frage dazu: Wozu/Wann soll die Logik denn das View updaten oder Elemente ändern?
-
Seh ich genauso. Zudem trenne ich meist auch noch "physikalisch", d.h. die Logik kommt in eine eigene DLL/so, die zur GUI dazugelinkt wird.
-
Im Gras-Schaf-Wolf-Beispiel ist das an einem praktischen Beispiel erklärt:
Objektorientierte Programmierung Für Dummies | ISBN: 3527700579