Klassendesign bei UI Anwendung



  • Mahlzeit!

    Eine kleine Frage zum Design einer GUI Anwendung (C++ und Qt).

    Ich habe eine recht grosse Fensterklasse mit Tonnen von Membern (Dialoge etc.).
    Jetzt habe ich auch viele Funktionalitäten, die mit der GUI nur bedingt zu tun haben, wie z.B. das Laden einer XML Projekdatei. Sagen wir ich habe dafür eine Methode bool loadProject(const string& path)

    Würdet ihr diese Methode direkt der Main Fensterklasse geben? Einerseits passt es, da das Laden des Projects ja auch durchs Fenster angestossen wird (per Menü File -> Open Project), andererseits hat das Fenster direkt ja auch nix zu tun mit dem Laden des Projects.
    Oder sollte lieber die Fensterklasse ein Hilfsobjekt besitzen, dass das Laden uebernimmt?
    Sprich:
    Variante A

    class MainWindow : public QMainWindow {
       bool loadProject(const string& path) {
          // Project Datei oeffnen, parsen, Dialoge fuellen etc.
       }
    };
    

    Variante B

    class MainWindow : public QMainWindow {
       Project project;
    
       bool loadProject(const string& path) {
          return project.loadProject(path);
       }
    };
    

    Was findet ihr davon besser? Oder ein ganz anderer Ansatz?



  • MVC wäre zu empfehlen. Deine GUI fiele in den Bereich View, die Projektdaten in Model.
    Deine Fensterklasse wäre nur zur Darstellung zu gebrauchen, die Projektdaten lägen in einer eigenen Klasseninstanz, welche auch für dessen Umgang gebräuchlich sei, und der Programmfluss erledigt den Rest.



  • Also Variante B?



  • Nein, keine von beiden, die Aufgabe des Ladens des Projektes sollte schon nichts mit dem Fenster zu tun haben, lediglich die Änderung der Attribute der zu zeigenden Elemente sollte Teil dessen sein.



  • Youka schrieb:

    Nein, keine von beiden, die Aufgabe des Ladens des Projektes sollte schon nichts mit dem Fenster zu tun haben, lediglich die Änderung der Attribute der zu zeigenden Elemente sollte Teil dessen sein.

    Das klingt jetzt in der Theorie ganz nett, aber wie soll das praktisch gehen? Das Laden wird nun mal von der GUI angestossen, folglich muss das MainWindow irgendwie das Laden anstossen. Ergo braucht doch zwingend das MainWindow einen Zeiger auf das Projekt/Data?



  • Youka schrieb:

    Nein, keine von beiden, die Aufgabe des Ladens des Projektes sollte schon nichts mit dem Fenster zu tun haben

    Wieso? Das Laden hat er in seiner Variante B doch in einer eigenen Klasse. Jetzt ruft er das in seiner Fensterklasse nur noch auf. Wenn du einen Knopf "Datei öffnen" hast, dann ist es doch völlig in Ordnung.



  • Mechanics schrieb:

    Das Laden hat er in seiner Variante B doch in einer eigenen Klasse. Jetzt ruft er das in seiner Fensterklasse nur noch auf. Wenn du einen Knopf "Datei öffnen" hast, dann ist es doch völlig in Ordnung.

    Nun geht es ihm allerdings nicht nur ums Öffnen und Einfügen in die Fenster, sondern auch ums Parsen und möglicherweise lagern von Daten. Zudem legt er scheinbar das gesamte Projekt in einer Fenster-Klasse ab, was dem MVC-Prinzip widerspricht (Controller+Model als Teil der View).

    uiDesigner schrieb:

    Das Laden wird nun mal von der GUI angestossen, folglich muss das MainWindow irgendwie das Laden anstossen. Ergo braucht doch zwingend das MainWindow einen Zeiger auf das Projekt/Data?

    Einen Zeiger, aber nicht das Projekt selbst.


Anmelden zum Antworten