Frage

Ich arbeite an einer desktop-Anwendung in PyGTK und zu sein scheinen, stoßen sich gegen einige Einschränkungen von meinem Datei-Organisation.So weit ich habe strukturierten mein Projekt so:

  • application.py - hält die primäre Anwendung der Klasse (in den meisten funktionalen Routinen)
  • gui.py - hält eine lose gekoppelte GTK-gui-Implementierung.Griffe signal Rückrufe, etc.
  • command.py - hält Kommandozeilen-Automatisierung Funktionen nicht davon abhängig, dass die Daten in der application-Klasse
  • state.py - hält der Staat-Daten-Persistenz-Klasse

Dieser diente schon ziemlich gut so weit, aber an diesem Punkt application.py fängt an, ziemlich lange.Ich habe mir bei zahlreichen anderen PyGTK-Anwendungen, und Sie scheinen zu haben ähnliche strukturelle Probleme.An einem bestimmten Punkt das primäre Modul beginnt, sich sehr lange und es gibt keine offensichtliche Möglichkeit, zu brechen den code in enger Module ohne Einbußen bei der Klarheit und Objekt-Orientierung.

Ich habe überlegt, ob die GUI die primäre Modul und einzelne Module für die Symbolleiste-Routinen, die Menüs etc., aber an diesem Punkt glaube ich, verlieren die Vorteile von OOP und am Ende mit einem alles-Referenzen-alles Szenario.

Sollte ich nur Angebot mit einer sehr langen zentralen Modul oder gibt es eine bessere Art und Weise der Strukturierung des Projektes, so dass ich nicht darauf angewiesen, die Klasse browser, so viel?

BEARBEITEN ICH

Ok, also Punkt getroffen, über die MVC-Zeug.Ich habe eine grobe Näherung von MVC in meinem code, aber zugegeben, ich könnte wahrscheinlich gewinnen einige Kilometer durch die weitere Trennung von Modell und controller.Allerdings lese ich über python-gtkmvc Dokumentation (das ist ein toller Fund, by the way, danke für die darauf verweisen) und mein Eindruck ist, dass es nicht geht um mein problem zu lösen, so viel wie nur formalisieren es.Meine Anwendung ist eine einzelne glade-Datei, in der Regel ein einzelnes Fenster.Also, egal wie fest ich definiere das MVC-Rollen der Module werde ich noch habe ein controller-Modul tun die meisten alles, was so ziemlich das, was ich jetzt habe.Zugegeben, ich bin ein little fuzzy, der auf die richtige MVC-Implementierung, und ich werde weiter forschen, aber es funktioniert nicht für mich Aussehen wie diese Architektur ist viel mehr Sachen, die aus meinem Haupt-Datei, nur geht das umbenennen der Datei zu controller.py.

Sollte ich denken, über separate Controller - /View-Paare für einzelne Abschnitte des Fensters (die Symbolleiste, Menüs, etc)?Vielleicht ist das, was ich bin fehlt hier.Es scheint, dass dies ist, was S.Lott bezieht sich in seinem zweiten Punkt.

Vielen Dank für die Antworten bisher.

War es hilfreich?

Lösung

In das Projekt Wader wir verwenden python gtkmvc, das macht vieles einfacher in der Anwendung des MVC-Muster bei der Verwendung von pygtk und glade, können Sie sehen die Datei-Organisation, der unser Projekt in der svn-repository:

wader/
  cli/
  common/
  contrib/
  gtk/
    controllers/
    models/
    views/
  test/
  utils/

Andere Tipps

Dies hat wahrscheinlich nichts zu tun, die mit PyGTK, sondern eine Allgemeine code-Organisation Problem.Sie würden wahrscheinlich davon profitieren die Anwendung einiger MVC (Model-View-Controller) design Pattern.Finden Design Patterns, zum Beispiel.

"hält die primäre Anwendung der Klasse (in den meisten funktionalen Routinen)"

Als im singular-eine Klasse?

Ich bin nicht überrascht, dass die Eine Klasse Macht Alles design funktioniert nicht.Könnte es nicht sein, was ich nennen würde-Objekt-orientiert.Es klingt nicht wie es folgt den typischen MVC-design-Muster, wenn Sie Ihre Funktion ist, häufen sich in einer einzelnen Klasse.

Was ist in dieser massiven Klasse?Ich schlage vor, dass Sie wahrscheinlich überarbeiten Sie diese in Stücke.Sie haben zwei Bewerber die Abmessungen für die Umgestaltung Ihrer application-Klasse-wenn, ja, ich habe die errieten, dass Sie habe setzen alles in einer einzigen Klasse.

  1. Bevor Sie irgendetwas anderes tun, umgestalten, in Komponenten, die parallel Real-World Entities.Es ist nicht klar, was in Ihrem "state.py" -- ob dies ein angemessener Modell von realen Entitäten, oder einfach nur die Zuordnungen zwischen den persistenten Speicher und einige trübe Datenstruktur in der Anwendung.Wahrscheinlich würden Sie verschieben Verarbeitung aus Ihrer Anwendung und in Ihrem Modell (ggf. state.py möglicherweise eine neue Modul, dass ist richtige Modell.)

    Brechen Sie Ihr Modell in Stücke.Es wird helfen, organisieren die Kontroll-und view-Elementen.Die häufigsten MVC-Fehler ist, zu viel Kontrolle und nichts in die Modell.

  2. Später, wenn Ihr Modell ist die meiste Arbeit gemacht, man kann sich umgestalten in Komponenten parallel zu den GUI-Darstellung.Unterschiedlichen top-level-frames, zum Beispiel, sollte wahrscheinlich haben separate cotrol Objekte.Es ist nicht klar, was in "GUI.py" -- könnte dies ein gutes Bild.Was zu fehlen scheint, ist ein-Komponente Steuern.

Sorry so spät Antworte. Kiwi scheint mir eine viel bessere Lösung, als gtkmvc.Es ist meine erste Abhängigkeit für alle pygtk-Projekt.

Python 2.6 unterstützt explizite relative Importe, die Verwendung von Paketen noch einfacher als die vorherigen Versionen.Ich schlage vor, Sie schauen in das, brechen Sie Ihre app in kleinere Module in einem Paket.Sie können organisieren Ihre Anwendung wie diese:

myapp/
  application/
  gui/
  command/
  state/

Wo jedes Verzeichnis hat seine eigenen __init__.py.Sie können haben einen Blick auf die python-app oder sogar auf standard-Bibliothek von Modulen für Beispiele.

So haben nicht zurück gehört zu meinem Bearbeiten auf die ursprüngliche Frage, die ich getan habe einige mehr Forschung, und ich die Schlussfolgerung scheint zu sein, dass ja, Ich sollte brechen, die Oberfläche in mehreren Ansichten, jeder mit seinen eigenen controller.Python-gtkmvc bietet die Möglichkeit, dies durch die Bereitstellung einer glade_top_widget_name parameter der View-Konstruktor.Dies alles scheint zu machen ein gutes Geschäft Sinn, obwohl es wird erfordern einen großen Umgestaltung meiner vorhandenen Codebasis, die ich kann oder kann nicht bereit sein, sich zu verpflichten, die in Naher Zukunft (ich weiß, ich weiß, ich sollte.) Darüber hinaus, ich bin Links zu Fragen, ob sollte nur noch ein einziges Modell-Objekt (meine Anwendung ist ziemlich einfach-nicht mehr als zwanzig-fünf staatlichen vars) oder wenn ich es zu brechen in mehrere Modelle und haben für den Umgang mit Controllern beobachten mehrere Modelle und verketten von Benachrichtigungen über Sie.(Wieder weiß ich, dass ich wirklich sollte letzteres tun.) Wenn jemand irgendwelche Erkenntnisse, habe ich noch nicht wirklich das Gefühl, ich habe mittlerweile eine Antwort auf die ursprüngliche Frage, ich habe zwar eine Richtung Kopf im jetzt.

(Außerdem scheint es bei Ihr sein sollten weitere architektonische Möglichkeiten an die hand, gegeben, dass bis jetzt hatte ich nicht gesehen, ein einzelnes Python-Anwendung codierte im MVC-Stil, aber dann wieder viele Python-Anwendungen neigen dazu, genau das problem habe ich oben beschrieben.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top