Model-View-Controller: Interagiert der Benutzer mit dem View oder mit dem Controller? [geschlossen]

13

Ich habe kürzlich etwas über das MVC-Entwurfsmuster gelernt. Ich lerne aus dem Head First Design Pattern-Buch.

Nach diesem Buch (wenn ich es richtig verstehe):

Das Modell besteht hauptsächlich aus der Anwendungslogik und den Anwendungsdaten.

Die Ansicht ist im Grunde die GUI, die das Modell für den Benutzer visuell darstellt.

Der Controller ist dafür verantwortlich, zu vermitteln und als Vermittler zwischen der Ansicht und dem Modell zu agieren. Die Ansicht meldet dem Controller, dass der Benutzer eine Aktion ausgeführt hat, und der Controller übersetzt diese in Methodenaufrufe für das Modell.

Viele Stellen im Internet widersprechen jedoch dem, was ich aus diesem Buch verstehe. Sie behaupten, dass der Benutzer im Allgemeinen mit dem Controller interagiert, nicht mit der Ansicht.

Welches ist wahr oder häufiger? Interagiert der Benutzer direkt mit dem Controller oder direkt mit der Ansicht? Sind beide Ansätze akzeptabel? Welches ist häufiger?

Aviv Cohn
quelle
4
Diese Frage ist nicht so aussagekräftig zu beantworten, wie Sie sie geschrieben haben. Geben Sie uns ein Beispiel für eine der Stellen im Web, die dem Buch widerspricht, und wir werden versuchen, es zu erklären. Seien Sie genau mit Ihrem Beispiel.
Robert Harvey
1
2 Antworten, beide positiv bewertet, eine sagt "Interagieren mit der Ansicht" die andere sagt "Interagieren mit der Steuerung" .... lässt mich denken, dass MVC keine sehr gute Architektur ist, wenn dies auf einer so fundamentalen Ebene verwirrt ist!
Gbjbaanb
Klicken Sie auf die Steuerelemente der Anwendung oder auf die Datenbankabfragen? Die Interaktion erfolgt direkt mit der Benutzeroberfläche, die selbst eine Ansicht ist. Die Ansicht ruft normalerweise Anforderungen an den Server auf (bei Web-Apps) oder ruft die dort registrierten Hooks auf (bei Client-Apps). Ansonsten ist die ganze MVC nur Mist.
Luke1985
@spectre Es ist nicht sinnvoll, MVC zu schließen, ohne eine Erklärung und im Idealfall eine Alternative anzugeben. Andernfalls trägt diese Entlassung nichts bei und hätte in Ihrem Kommentar einfach weggelassen werden sollen. Abgesehen davon wäre es immer noch unangebracht.
Underscore_d

Antworten:

18

Der Benutzer interagiert mit der Ansicht , aber die Ansicht muss dem Controller die Aktionen mitteilen . Der Controller kann das Modell aktualisieren , dies ist jedoch nicht bei jeder Änderung erforderlich.

Die Beschreibung basiert auf meinen persönlichen Erfahrungen mit der .NET-Implementierung von MVC. Ihre Implementierung kann unterschiedlich sein.

Im Controller werden Aktionen verarbeitet, im Grunde genommen eine Business-Schicht. Ein einfacher Controller wird nichts weiter tun, als die Daten aus dem Modell in die Ansicht einzuspeisen. Ein komplizierter Controller führt alle Arten von Aktionen aus, bis hin zu Sicherheitsverwaltung, Authentifizierung, Autorisierung, Registrierung und möglicherweise vielen anderen Dingen.

Die Ansicht sollte nur für die Anzeige der Informationen auf eine Weise verantwortlich sein, die der Benutzer verstehen kann. Hier kann es zu einigen Überschneidungen sowohl mit dem Controller als auch mit dem Modell kommen, da beispielsweise Single Page Applications (SPAs) ein Feedback zur Datenvalidierung für den Benutzer haben. Alle anderen Überkreuzungen sind stark verpönt.

Das Modell befasst sich mit Daten. Dies beinhaltet die Validierung von Daten (falls zutreffend). Das Speichern und Abrufen von Daten wird ebenfalls in dieser Schicht behandelt.


AKTUALISIEREN

Es scheint einige Verwirrung darüber zu geben, wer was wann tut. Ich habe zwei verschiedene Übersichten der MVC-Architekturen eingefügt, da sie ähnlich, aber nicht gleich sind. Es gibt Raum für beide Interpretationen. Möglicherweise viele mehr. Die obigen Beschreibungen sind meine Interpretation von MVC aus mehreren Quellen, einschließlich meiner eigenen Erfahrung beim Erstellen von Anwendungen unter Verwendung dieser Methodik. Hoffentlich hilft dieses Update dabei, diese Verwirrung zu beseitigen.

MVC ist ein Versuch, ein Entwurfsmuster für die Trennung von Interessen für die Softwareentwicklung zu erstellen . Es wurde hauptsächlich in webbasierten Anwendungen implementiert (meines Wissens).

Die Ansicht übernimmt die gesamte Benutzerinteraktion. Wenn Ihr Benutzer auf eine Schaltfläche klickt, bestimmt die Ansicht, ob es sich bei dem Klick um eine Benutzeroberflächeninteraktion handelt oder um eine Interaktion, die nicht von ihm betroffen ist (eine Controllerinteraktion). Wenn die Schaltfläche Werte von einem Feld in ein anderes kopiert, bestimmt Ihre Implementierung, ob dies ein View-Anliegen oder ein Controller-Anliegen ist. Diese Unschärfe der Bedenken tritt höchstwahrscheinlich nur bei einer Single Page Application (SPA) auf.

Im Controller werden Ihre Aktionen verarbeitet. Die Ansicht hat mitgeteilt, dass der Benutzer beschlossen hat, die Werte für einige Felder zu ändern. Der Controller kann die Validierung dieser Daten durchführen oder sie kann vom Modell verarbeitet werden. Dies ist wiederum implementierungsabhängig. Wenn der Controller über Sicherheitsfunktionen verfügt, wird möglicherweise festgestellt, dass der Benutzer nicht über die erforderlichen Berechtigungen zum Ausführen der Aktion verfügt. Es würde die Änderungen verwerfen und die Ansicht entsprechend aktualisieren. Der Controller bestimmt auch, welche Daten aus dem Modell abgerufen werden sollen, wie diese gepackt werden sollen und aktualisiert die Ansicht mit diesen Daten.

Das Modell bestimmt, wie und wo Daten gespeichert werden. Es kann auch eine Validierung dieser Daten vor dem Speichern durchführen (dies sollte erfolgen, da die Ansicht gelegentlich umgangen wird).


Wikipedia hat einen Artikel über MVC .

  • Ein Modell benachrichtigt seine zugeordneten Ansichten und Controller, wenn sich sein Status geändert hat. Mit dieser Benachrichtigung können Ansichten ihre Präsentation aktualisieren und die Controller die verfügbaren Befehlssätze ändern. In einigen Fällen kann eine MVC-Implementierung stattdessen "passiv" sein, sodass andere Komponenten das Modell nach Updates abfragen müssen, anstatt benachrichtigt zu werden.
  • Eine Ansicht erhält vom Controller alle Informationen, die er zum Generieren einer Ausgabedarstellung für den Benutzer benötigt. Es kann auch generische Mechanismen bereitstellen, um den Controller über Benutzereingaben zu informieren.
  • Ein Controller kann Befehle an das Modell senden, um den Status des Modells zu aktualisieren (z. B. Bearbeiten eines Dokuments). Es kann auch Befehle an die zugehörige Ansicht senden, um die Darstellung des Modells in der Ansicht zu ändern (z. B. durch Scrollen durch ein Dokument).

Aus der Microsoft-Übersicht über MVC .

  • Modelle. Modellobjekte sind die Teile der Anwendung, die die Logik für die Datendomäne der Anwendung implementieren. Häufig rufen Modellobjekte den Modellstatus ab und speichern ihn in einer Datenbank. Beispielsweise kann ein Product-Objekt Informationen aus einer Datenbank abrufen, bearbeiten und dann aktualisierte Informationen in eine Products-Tabelle in einer SQL Server-Datenbank zurückschreiben.

    In kleinen Anwendungen ist das Modell oft eine konzeptionelle Trennung anstelle einer physischen. Wenn die Anwendung beispielsweise nur ein Dataset liest und es an die Ansicht sendet, verfügt die Anwendung nicht über eine physische Modellschicht und zugeordnete Klassen. In diesem Fall übernimmt der Datensatz die Rolle eines Modellobjekts.

  • Ansichten. Ansichten sind die Komponenten, die die Benutzeroberfläche der Anwendung anzeigen. In der Regel wird diese Benutzeroberfläche aus den Modelldaten erstellt. Ein Beispiel wäre eine Bearbeitungsansicht einer Products-Tabelle, in der Textfelder, Dropdown-Listen und Kontrollkästchen basierend auf dem aktuellen Status eines Product-Objekts angezeigt werden.

  • Controller. Controller sind die Komponenten, die die Benutzerinteraktion verwalten, mit dem Modell arbeiten und letztendlich eine Ansicht zum Rendern auswählen, die die Benutzeroberfläche anzeigt. In einer MVC-Anwendung werden in der Ansicht nur Informationen angezeigt. Der Controller verarbeitet und reagiert auf Benutzereingaben und Interaktionen. Beispielsweise verarbeitet der Controller Abfragezeichenfolgenwerte und übergibt diese Werte an das Modell, das diese Werte möglicherweise zum Abfragen der Datenbank verwendet.

Adam Zuckerman
quelle
Was ist, wenn Sie nicht für alle Aktionen eine grafische Benutzeroberfläche haben? Was ist, wenn Sie nur API für bestimmte Teile implementiert haben? Bedeutet das, dass der Benutzer manchmal mit der Ansicht und manchmal direkt mit dem Controller interagiert?
Mahdi
1
Aus meiner Sicht nein. Die API ersetzt die Ansicht.
Adam Zuckerman
aber die API könnte eine einfache sein url-routes, in die gelegt Controller. Ich meine, überhaupt keine Aussicht ...
Mahdi
1
@AdamZuckerman Danke für die Antwort. Im nächsten Kommentar beschreibe ich , wie meiner Meinung nach eine allgemeine MVC-Implementierung funktioniert. Bitte bestätigen Sie, ob sie korrekt ist oder nicht. Vielen Dank
Aviv Cohn
2
@ Mahdi Eine API gibt es per Definition als Programmierschnittstelle , nicht als Benutzerschnittstelle . Programme interagieren mit der API, Benutzer interagieren mit der Ansicht.
Eric King
4

Der Benutzer interagiert mit dem Controller . Vom technischen Point-of-View Sie sind nicht mit der zusammenwirkenden Ansicht , sie ist nur mit es mit den zu interagieren - Controller .

An der Oberfläche scheint es, dass der Benutzer mit der GUI interagiert - auch für einen Nicht-Programmierer ist dies sinnvoller, aber wenn Sie auf eine Schaltfläche klicken, sprechen Sie im Grunde genommen mit dem Controller und nicht mit der Ansicht .

Auch haben nicht alle Anwendungen - selbst MVC-Webanwendungen - eine GUI. Sie können mit dem Controller über eine API interagieren - url-routeszum Beispiel einfach im Controller selbst.

Die Steuerung sollte der Ort sein, erhält und Griffe , die Benutzeranforderungen. Wenn Sie also irgendwie direkt von View aus auf das Modell zugreifen - egal wie, dann ist es nicht mehr MVC .

Mahdi
quelle
2
+1 Das ist richtig. Dinge wie Menüs und Symbolleisten sind Teil der GUI, aber nicht Teil der Ansicht und gehen direkt zum Controller. Tastatureingaben ebenfalls.
david.pfx
1
Der Grund, warum Ansichten als Abstraktion existieren, ist, dass wir sie bei Bedarf leicht ersetzen können. Ein Controller für eine App auf verschiedenen Plattformen kann gleich sein, aber die Ansichten müssen Benutzergesten unterschiedlich erkennen und in Controller-Vorgänge umsetzen. Ich stimme daher nicht zu, dass Benutzer direkt mit Controllern interagieren.
Fuhrmanator
1
@ Mahdi Ich würde sagen, in diesem Fall gibt es überhaupt keine Benutzerinteraktion, sondern die Ansicht, die programmgesteuert mit dem Controller kommuniziert. Die einzigen Interaktionen, die vom Benutzer initiiert werden, erfolgen über die Ansicht.
Eric King
1
@ david.pfx Tastenanschläge können nicht direkt von einem Browserfenster zu einem Controller geleitet werden.
Adam Zuckerman
1
@Izkata "Die Ansicht ist der Teil des Codes, an den Anfragen gesendet werden" - Entschuldigung, aber das ist das Schlimmste, was ich hier gehört habe. Wie ist das überhaupt möglich? Können Sie es durch Angabe eines Verweises in einem Artikel oder Buch sichern?
Mahdi
1

Lassen Sie uns ein konkretes Beispiel dafür verwenden, warum Benutzer direkt mit Ansichten und nicht mit Controllern interagieren.

In der Musik-App auf dem iPhone ist die Wiedergabe einer Wiedergabeliste eine wichtige Funktion. "Playliste abspielen" ist eine Funktion eines Controllers zur App.

Es gibt mehrere Möglichkeiten, diese Funktion zu aktivieren. Ich kann auf die Wiedergabeliste in der App klicken oder Siri (Sprachschnittstelle) auffordern, dieselbe Funktion auszuführen. Das sind zwei verschiedene Gesten , die von den verschiedenen Ansichten erkannt werden.

Das Feedback in jeder Ansicht ist auch unterschiedlich. Siri wird Ihnen mitteilen, dass die von Ihnen angeforderte Musik abgespielt wird. Die Musik-App zeigt Ihnen visuell an, dass die Wiedergabeliste abgespielt wird.

Fuhrmanator
quelle