MVP (Supervising Controller) Aktualisiert die Ansicht das Modell?

8

Ich habe über MVP gelesen, insbesondere über Supervising Controller. Eine Sache, bei der ich Schwierigkeiten habe, meinen Kopf herumzureißen, ist die Interaktion der Ansicht mit dem Modell.

Nach meinem Verständnis sollte der Präsentator das Modell aktualisieren und die Ansicht aus dem Modell lesen. Der Präsentator kann die Ansicht auch über eine Schnittstelle aktualisieren. Martin Fowlers Artikel dazu scheint genau das zu zeigen ( http://martinfowler.com/eaaDev/SupervisingPresenter.html ).

Andere Artikel / Blogs zeigen jedoch die Ansicht, in der das Modell direkt aktualisiert wird ( https://blogs.msdn.microsoft.com/erwinvandervalk/2009/08/14/the-difference-between-model-view-viewmodel-and-other- getrennte Präsentationsmuster / ).

Ich weiß, dass dies nur Muster sind, daher wird es unterschiedliche Implementierungen geben, aber die Ansicht, die das Modell aktualisiert, scheint viel mehr zu tun, als es sollte.

Angenommen, ich hatte eine Personenklasse, die einen Namen und eine Telefonnummer enthielt. In der Ansicht können dieser Name und diese Nummer sowie eine Schaltfläche zum Senden angezeigt werden, um den Namen und die Nummer der Person zu ändern. Wenn Sie auf die Schaltfläche "Senden" klicken, wird erwartet, dass die Aktualisierung im Presenter und nicht in der Ansicht ausgeführt wird. In dem Artikel, auf den ich verwiesen habe, wird jedoch vorgeschlagen, dass die Ansicht das Modell direkt aktualisieren kann.

Sollte die Ansicht das Modell jemals aktualisieren? Oder sollte das nur vom Moderator erledigt werden?

BEARBEITEN:

Code aus dem MSDN-Artikel:

public class PersonalDataView : UserControl, IPersonalDataView
{
    protected TextBox _firstNameTextBox;

    public void SetPersonalData(PersonalData data)
    {
        _firstNameTextBox.Value = data.FirstName;
    }

    public void UpdatePersonalData(PersonalData data)
    {
        data.FirstName = _firstNameTextBox.Value;
    }
}
Eric
quelle

Antworten:

6

Seit seinem ursprünglichen Entwurf im Jahr 1996 durch Mike Potel gibt es mehrere Varianten des MVP . Martin Fowler beschreibt einige davon in einem anderen Artikel über die GUI-Architektur .

Einer der Hauptunterschiede zwischen den Varianten besteht darin, ob die Ansicht vollständig vom Modell isoliert ist oder nicht:

  • Im ersten Fall ist der Moderator der Mann inmitten einer "passiven Sichtweise" und das Modell.
  • Im zweiten Fall ist der Präsentator ein "Überwachungscontroller", es gibt jedoch Interaktionen direkt zwischen der Ansicht und dem Modell. Potels Artikel beschreibt die Art der Interaktionen gut: Die Ansicht kann Daten vom Modell anfordern, und das Modell kann die Ansicht einiger Ereignisse benachrichtigen.

In keinem Fall würde die Ansicht das Modell direkt ändern. Der Modellwechsel erfolgt immer über den Presenter (oder den Controller in einer MVC).

Anmerkung 1: Der MSDN-Artikel zeigt in seiner Einführung zum MVC-Teil (Model View Controller) nur einen Pfeil direkt von der Ansicht zum Modell. Der Pfeil ist in die falsche Richtung gerichtet, aber der Text ist korrekt: Die Ansicht kann auf das Modell zugreifen und sich bei Änderung der Modelldaten selbst ändern (dh nicht das Modell, sondern sich selbst neu zeichnen).

Anmerkung 2: Der MSDN-Artikel zeigt auch das MVVM-Muster von Microsoft, bei dem es sich in etwa um ein MVP handelt, der Präsentator wird jedoch nicht eindeutig als "ViewModel" bezeichnet. Die darin enthaltene Ansicht aktualisiert das Modell jedoch nicht direkt.

Ihre Bearbeitung:

Der Code Ihrer Bearbeitung zeigt eine bidirektionale Datenbindung an, bei der die Aktualisierung der Daten in der Ansicht direkt eine Änderung des Modells auslösen würde. Dies widerspricht in der Tat dem ursprünglichen MVP-Muster, bei dem die Ansicht den Präsentator über einen "Interaktor" über gewünschte Änderungen informiert und der Präsentator das Monopol hat, "Befehle" zum Aktualisieren des Modells aufzurufen.

Bemerkung 3: Ich denke, der Autor dieses MSDN-Blogs war mehr daran interessiert, die MVVM-Architektur einzuführen, als wie Martin Fowler einen umfassenden Artikel über die anderen Architekturen zu schreiben. Ich denke auch, dass die ADO- Datenbindungsarchitektur von Microsoft, die bis in die frühen Tage des .net-Frameworks zurückreicht, ein derart gemischtes Design favorisierte und die Implementierung eines klassischen MVP weniger trivial machte (es war eine DataObjectSource erforderlich, um den Zugriff auf Datenmodelle zu isolieren).

Christophe
quelle
1
Danke für Ihre Antwort. Ich habe meine Frage bearbeitet. Der MSDN-Artikel erläutert den MVP Supervision Controller und zeigt, wo das Modell als Parameter in der UpdatePersonalData-Methode übergeben wird. Diese Methode aktualisiert dann direkt das Modell. Dies scheint dem zu widersprechen, was Sie sagen, wenn Sie sagen: "In keinem Fall würde die Ansicht das Modell direkt ändern. Die Änderung des Modells erfolgt immer über den Presenter (oder den Controller in einer MVC)." Ich mag die Idee, dass das Modell in der Ansicht aktualisiert wird, nicht wirklich und stimme Ihrer Interpretation zu. Ist das nur Interpretation?
Eric
1
@EricS Ich denke, dass der Autor dieses MSDN-Blogartikels den Begriff "Datenzugriff" in MVP als bidirektionale Datenbindung falsch interpretiert hat. Ich habe meine Antwort bearbeitet, um dies hervorzuheben.
Christophe
1
@EricS Übrigens wird in Martin Fowlers Artikel "Die Ansicht verwendet normalerweise eine Form der Datenbindung, um einen Großteil der Informationen für ihre Felder zu
Christophe
1
Ich versuche immer noch, mich mit der Datenbindung zu beschäftigen und was sie wirklich ist und was nicht. Kann ich ohne ein Framework für die Datenbindung für mich die Datenbindung selbst implementieren, indem ich nur Getter und Setter verwende? Wenn ich in diesem Fall nur eine Einweg-Datenbindung implementieren möchte, hätte ich nur einen Getter, der Daten aus dem Modell abruft, das Modell jedoch nie aktualisiert. Stattdessen wird die Aktualisierung des Modells an den Präsentator delegiert.
Eric
1

Aus dem Artikel von Fowler's Supervising Presenter, den Sie in Ihrer Frage verlinkt haben:

Berücksichtigen Sie die Benutzeroberfläche in einer Ansicht und einem Controller, wobei die Ansicht die einfache Zuordnung zum zugrunde liegenden Modell und der Controller die Eingabeantwort und die komplexe Ansichtslogik übernimmt.

Es wird klargestellt, dass die Ansicht für alle einfachen Aufgaben direkt mit dem Modell kommunizieren kann. Es widerspricht also nicht dem MSDN-Artikel. Dies liegt genau daran, dass Sie für die einfache Zuordnung / Bindung von Eigenschaften keine weitere Ebene benötigen, da dies die Dinge nur ohne großen Nutzen komplizieren würde.

Wieder spricht Fowler am Ende des Artikels darüber:

[...] das Fahrproblem ist, wie viel Verhalten in der Ansicht zu belassen ist. Passive View ist dem Supervising Controller sehr ähnlich, mit dem Unterschied, dass Passive View das gesamte Verhalten der Ansichtsaktualisierung in den Controller einfügt, einschließlich einfacher Fälle. Dies führt zu einer zusätzlichen Programmierung, bedeutet jedoch, dass das gesamte Präsentationsverhalten testbar ist. Die Wahl zwischen beiden hängt davon ab, welche Art von Datenbindungsunterstützung Sie haben und ob Sie diese gerne durch Controller-Tests ungetestet lassen.

Sie sollten einige Dinge beachten:

  • Stellen Sie sicher, dass das Modell jederzeit der "Master" seiner Daten ist. Dies bedeutet, dass die Ansicht niemals direkt in die Felder des Modells schreiben sollte (auf jeden Fall eine schlechte Idee). Eigenschaften sind in Ordnung, wenn Ihre Sprache sie unterstützt. Auf diese Weise kann das Modell weiterhin auf Aktualisierungen seiner Daten reagieren (z. B. durch Berechnung eines anderen Felds).
  • Koppeln Sie Ihr Modell nicht mit der Ansicht. Das Modell muss unabhängig testbar sein und im Prinzip sollten Sie in der Lage sein, die Ansicht zu ändern, ohne das Modell zu beeinflussen. Dies bedeutet, dass das Modell die Ansicht niemals direkt aufrufen sollte. Verwenden Sie Schnittstellen oder wahrscheinlich am besten das Observer-Muster. Die Ansicht kann das Modell für Updates abonnieren.
  • Fügen Sie niemals eine (Geschäfts-) Logik in die Ansicht ein. Wenn Sie feststellen, dass Sie ifAnweisungen in den Ansichtscode schreiben , überlegen Sie, ob diese eher zum Präsentator oder zum Modell gehören sollen.
Jhyot
quelle