Frage

Ich habe eine Design-Frage nach der Kommunikation zwischen dem Modell und dem Moderator in dem MVP-Entwurfsmuster -. Oder genauer gesagt seine abgeleitete Form der passive Ansicht

Lassen Sie sich die folgende einfache GUI als Beispiel annehmen: Ich habe ein Fenster, in dem meine Ansicht nach einer Liste ist und es besteht die Möglichkeit, einen Datei-Dialog zu öffnen, um eine Datei auszuwählen. Sobald ich meine Auswahl der Datei fertig sind werden in die Liste angehängt werden.

Mein Modell ist die Sammlung aller Dateien, die ich geöffnet haben.

Ein Straight-Forward-Implementierung in den Sinn kommt (Pseudo-Python-Code):

Lösung A

class Model():
     def add(filename):
         # add file
         ...
         # return True if successful
         return True

class Presenter():
    # event from GUI
    def onFileOpen():
        filename = FileSelectorStuff()
        isFileAdded = model.add(filename)
        if isFileAdded:
            view.insertItem(filename)

In diesem Fall weiß ich, dass die Datei zum Modell hinzugefügt wurde und damit ich entsprechend die Ansicht aktualisieren.

Auf der anderen Seite kann ich die Datei in das Modell hinzufügen und dann warten, bis das Modell mir zu benachrichtigen, dass geändert hat und dass der Moderator hat die Ansicht zu aktualisieren, etwa so:

Die Lösung B

class Model():
     def add(filename):
         # add file
         ...
         # alert controller
         modelChanged(Type.FileAdded, filename)

class Presenter():
    # event from GUI
    def onFileOpen():
        filename = FileSelectorStuff()
        model.add(filename)

    # event from model
    def onModelChanged(type, filename):
        if type == Type.FileAdded:
            view.insertItem(filename)
        elif type == Type.FileRemoved:
            ...

Jetzt in diesem Fall arbeiten beide Implementierungen einfach gut. Aber nehmen wir an, dass das Modell auch die Dateien überwacht und muss den Vortragenden sagen, wenn einer von ihnen wurde gelöscht, zum Beispiel. Dann brauche ich diese Art von onModelChanged () Callback-Mechanismus trotzdem.

Meine Frage ist nun: sollte ich für die Aktualisierung der Ansicht (A für synchrone Updates und B für async), um die zwei Möglichkeiten, mischen oder besser gesagt es an einem Ort alle zentralen halten, wie in Lösung B vorgeschlagen ?

War es hilfreich?

Lösung

Dieses Problem wird wahrscheinlich lange gelöst, aber ich traf es von einer Suchmaschine ist hier so meine Antwort:

Verwenden B. Forget mischen.

Wenn Sie in Bits von A für Effizienz hinzufügen möchten, müssen Sie haben zwei Möglichkeiten für das Modell haben: man einen boolean Rückkehr, die anderen Emissions Ereignisse. Wenn die synchrone Model.add Methode Ereignisse abgibt, dann wird der Event-Handler in dem Moderator müssen sie Anruf während dieser Methode ignorieren. Messy.

Doch mein Verständnis für Passive Ansicht legt nahe, dass der Moderator ist derjenige verantwortlich für das Modell zu aktualisieren, so argumentiert werden könnte, dass es denjenigen sein sollte Dateien aus dem Modell zu entfernen, sowieso. Dies ebnet den Weg für eine A einzige Lösung.

Meine abschließende Antwort: Verwenden Sie A, oder Verwendung B. nicht mehr mischen.

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