Programm-Architektur
Verfasst: Mittwoch 28. Dezember 2022, 15:14
Hallo Alle,
Ich habe eine Frage was den grundsätzlichen Aufbau meines Programmes angeht und hoffe, ihr könnt mir dabei helfen.
Vielleicht zuerst kurz als Background. Für mich ist Python programmieren ein Hobby, das mir auch im Job hilft, um gewisse Dinge schneller und effizienter zu machen. Ich habe mir mein aktuelles Wissen selber beigebracht, also nie etwas in die Richtung gelernt (Schule, Uni,...). Trotzdem möchte ich das Ganze so "professionell" machen, wie möglich. Alleine schon um mir mein eigenes Leben leichter zu machen, wenn ich einen Code mal überarbeiten möchte. Die Details meiner Frage (z.B. dass ich tkinter verwende), sind eine Vorgabe von der ich nicht abrücken kann. Ebenso, dass ich das Model-View-Controller-Pattern verwende.
Nun zu meinem Problem:
Ich möchte ein Programm schreiben, dass folgende Aufgabe hat (sehr vereinfacht):
Ich habe eine Excel-Datei, die Informationen zu Flügen enthält (unter anderem die Höhe und Flugroute in Koordinatenform). Jeweils eine Zeile steht für einen Flug und pro Datei gibt es zig Zeilen (immer unterschiedlich).
Ich möchte nun die Flüge auf einem Canvas darstellen, über dieses Canvas die Flüge verändern können (z.B. indem man die Flugroute als Text ändert) und dann alles wieder speichern können.
Das Ganze mache ich mit tkinter.
Meine Frage bezieht sich jetzt nicht auf Einzelheiten (die Darstellung und Anpassung der Details über Textboxen ist kein Problem), sondern wie ich das Programm grundsätzlich aufbaue.
Folgenden Plan habe ich bis jetzt (Dateinamen sind nur Platzhalter und heißen in Wirklichkeit anders):
main.py --> Mein "Controller"
view.py --> Erstellt die Oberfläche inklusive aller Elemente die dazu gehören
data.py --> Lädt, verwaltet und speichert die Details der Flüge
Frage 1: Beim MVC-Pattern müssen View und Model getrennt sein, oder? Das bedeutet, dass die Klasse(n), die die Daten verwalten (z.B. das eigentliche Laden aus der Excel-Datei), niemals direkt auf die View zugreifen. Wenn ein Flug dargestellt (=am Canvas gezeichnet) werden soll, ruft das Model eine Methode im Controller auf, welcher wiederum der View "sagt", was angezeigt werden soll. Umgekehrt genauso. Angenommen, ich stelle einen Flug auf dem Canvas dar, dann klickt der User darauf und ändert etwas am Flug (z.B. indem er die Flugroute verändert - wie auch immer das dann tatsächlich gemacht wird), so muss das ja wieder in der Model-Klasse gespeichert werden (damit das dann auch bei Bedarf wieder in der Excel Datei gespeichert werden kann). Das würde bedeuten, dass die View dem Controller "sagt", was geändert werden soll (in diesem Beispiel die Flugroute) und der Controller wiederum ruft eine Methode im Model auf, die genau dieses macht. Verstehe ich das so richtig? Grundsätzlich würde das meiner Meinung nach Sinn machen, denn, wenn ich irgendwann z.B. von tkinter auf pyQt wechseln möchte, muss ich nur die View anpassen, Controller und Model bleiben aber gleich. Umgekehrt, wenn irgendwann Daten nicht mehr aus einer Excel-Datei laden möchte, sondern z.B. aus einer Datenbank, muss ich nur das Model anpassen und der Rest bleibt gleich. Was ich nur verwirrend finde, ist, dass ich immer den "Umweg" über den Controller gehen muss, der riesige Ausmaße annehmen wird (= viele Methoden).
Frage 2: Vorausgesetzt meine Annahme in Frage 1 ist korrekt, würdet ihr dann abstrakte Klassen als Trennung zwischen View und Controller, bzw. Model und Controller anlegen?
Frage 3: Zusätzlich zu den veränderlichen Daten im Model, also den Flügen, die sich je nach Ursprungsdatei unterscheiden, muss ich auch statische Daten laden und anzeigen, die sich nie verändern und in Form einer json-Datei gespeichert sind. Genauer gesagt geht es dabei um Informationen, wie zum Beispiel Ländergrenzen, die ich zeichne. Kann ich das im View machen, oder sollten auch diese Daten wieder im Model gespeichert werden?
Das wars mal fürs Erste;). Ich hoffe, ich habe mich verständlich ausgedrückt.
LG Flo
Ich habe eine Frage was den grundsätzlichen Aufbau meines Programmes angeht und hoffe, ihr könnt mir dabei helfen.
Vielleicht zuerst kurz als Background. Für mich ist Python programmieren ein Hobby, das mir auch im Job hilft, um gewisse Dinge schneller und effizienter zu machen. Ich habe mir mein aktuelles Wissen selber beigebracht, also nie etwas in die Richtung gelernt (Schule, Uni,...). Trotzdem möchte ich das Ganze so "professionell" machen, wie möglich. Alleine schon um mir mein eigenes Leben leichter zu machen, wenn ich einen Code mal überarbeiten möchte. Die Details meiner Frage (z.B. dass ich tkinter verwende), sind eine Vorgabe von der ich nicht abrücken kann. Ebenso, dass ich das Model-View-Controller-Pattern verwende.
Nun zu meinem Problem:
Ich möchte ein Programm schreiben, dass folgende Aufgabe hat (sehr vereinfacht):
Ich habe eine Excel-Datei, die Informationen zu Flügen enthält (unter anderem die Höhe und Flugroute in Koordinatenform). Jeweils eine Zeile steht für einen Flug und pro Datei gibt es zig Zeilen (immer unterschiedlich).
Ich möchte nun die Flüge auf einem Canvas darstellen, über dieses Canvas die Flüge verändern können (z.B. indem man die Flugroute als Text ändert) und dann alles wieder speichern können.
Das Ganze mache ich mit tkinter.
Meine Frage bezieht sich jetzt nicht auf Einzelheiten (die Darstellung und Anpassung der Details über Textboxen ist kein Problem), sondern wie ich das Programm grundsätzlich aufbaue.
Folgenden Plan habe ich bis jetzt (Dateinamen sind nur Platzhalter und heißen in Wirklichkeit anders):
main.py --> Mein "Controller"
view.py --> Erstellt die Oberfläche inklusive aller Elemente die dazu gehören
data.py --> Lädt, verwaltet und speichert die Details der Flüge
Frage 1: Beim MVC-Pattern müssen View und Model getrennt sein, oder? Das bedeutet, dass die Klasse(n), die die Daten verwalten (z.B. das eigentliche Laden aus der Excel-Datei), niemals direkt auf die View zugreifen. Wenn ein Flug dargestellt (=am Canvas gezeichnet) werden soll, ruft das Model eine Methode im Controller auf, welcher wiederum der View "sagt", was angezeigt werden soll. Umgekehrt genauso. Angenommen, ich stelle einen Flug auf dem Canvas dar, dann klickt der User darauf und ändert etwas am Flug (z.B. indem er die Flugroute verändert - wie auch immer das dann tatsächlich gemacht wird), so muss das ja wieder in der Model-Klasse gespeichert werden (damit das dann auch bei Bedarf wieder in der Excel Datei gespeichert werden kann). Das würde bedeuten, dass die View dem Controller "sagt", was geändert werden soll (in diesem Beispiel die Flugroute) und der Controller wiederum ruft eine Methode im Model auf, die genau dieses macht. Verstehe ich das so richtig? Grundsätzlich würde das meiner Meinung nach Sinn machen, denn, wenn ich irgendwann z.B. von tkinter auf pyQt wechseln möchte, muss ich nur die View anpassen, Controller und Model bleiben aber gleich. Umgekehrt, wenn irgendwann Daten nicht mehr aus einer Excel-Datei laden möchte, sondern z.B. aus einer Datenbank, muss ich nur das Model anpassen und der Rest bleibt gleich. Was ich nur verwirrend finde, ist, dass ich immer den "Umweg" über den Controller gehen muss, der riesige Ausmaße annehmen wird (= viele Methoden).
Frage 2: Vorausgesetzt meine Annahme in Frage 1 ist korrekt, würdet ihr dann abstrakte Klassen als Trennung zwischen View und Controller, bzw. Model und Controller anlegen?
Frage 3: Zusätzlich zu den veränderlichen Daten im Model, also den Flügen, die sich je nach Ursprungsdatei unterscheiden, muss ich auch statische Daten laden und anzeigen, die sich nie verändern und in Form einer json-Datei gespeichert sind. Genauer gesagt geht es dabei um Informationen, wie zum Beispiel Ländergrenzen, die ich zeichne. Kann ich das im View machen, oder sollten auch diese Daten wieder im Model gespeichert werden?
Das wars mal fürs Erste;). Ich hoffe, ich habe mich verständlich ausgedrückt.
LG Flo