Ich verstehe die Rolle des Modells und der Ansicht im Model-View-Controller-Muster, aber es fällt mir schwer zu verstehen, warum ein Controller erforderlich ist.
Nehmen wir an, wir erstellen ein Schachprogramm mit einem MVC-Ansatz. Der Spielstatus sollte das Modell sein, und die GUI sollte die Ansicht sein. Was genau ist der Controller in diesem Fall?
Ist es nur eine separate Klasse, die alle Funktionen enthält, die aufgerufen werden, wenn Sie beispielsweise auf eine Kachel klicken? Warum nicht einfach die gesamte Logik des Modells in der Ansicht selbst ausführen?
design-patterns
mvc
Anne Nonimus
quelle
quelle
Antworten:
Anhand Ihres Beispiels würde der Controller entscheiden, was ein legaler Schachzug ist oder nicht. Der Controller würde die Ansicht wissen lassen, wie die Teile beim Start auf der Platine angeordnet werden sollen, wobei die vom Modell erhaltenen Informationen verwendet werden. Es gibt weitere Dinge, die der Controller erledigen kann, aber der Schlüssel ist, über Business Logic auf dieser Ebene nachzudenken.
Es gibt Zeiten, in denen der Controller lediglich Informationen wie eine Anmeldeseite hin und her weitergibt. In anderen Fällen ist der Controller der schwierige Teil der Entwicklung, da auf dieser Ebene viele Dinge zu erledigen sind, z. B. das Durchsetzen von Regeln oder das Ausführen komplizierter Berechnungen. Vergiss den Controller nicht!
quelle
Der Controller ist der Klebstoff, der das Modell und die Ansicht miteinander verbindet, und es ist auch die Isolierung, die sie voneinander trennt. Das Modell sollte nichts über die Ansicht wissen und umgekehrt (zumindest in Apples Version von MVC). Der Controller verhält sich wie ein Zweiwegeadapter, der Benutzeraktionen aus der Ansicht in Nachrichten an das Modell übersetzt und die Ansicht mit Daten aus dem Modell konfiguriert.
Durch die Verwendung des Controllers zur Trennung von Modell und Ansicht wird der Code wiederverwendbarer, testbarer und flexibler. Betrachten Sie Ihr Schachbeispiel. Das Modell würde natürlich den Spielstatus enthalten, aber es könnte auch die Logik enthalten, die Änderungen des Spielstatus beeinflusst, z. B. das Bestimmen, ob ein Zug zulässig ist, und das Entscheiden, wann das Spiel beendet ist. Die Ansicht zeigt ein Schachbrett und Figuren an und sendet Nachrichten, wenn sich eine Figur bewegt, aber sie weiß nichts über die Bedeutung hinter den Figuren, wie sich jede Figur bewegt usw. Der Controller weiß sowohl über das Modell als auch über die Ansicht Bescheid der Gesamtablauf des Programms. Wenn der Benutzer auf die Schaltfläche "Neues Spiel" klickt, weist ein Controller das Modell an, ein Spiel zu erstellen, und verwendet den Status des neuen Spiels, um das Spielbrett einzurichten. Wenn der Benutzer einen Zug macht,
Sehen Sie sich an, was Sie erhalten, wenn Sie das Modell und die Ansicht getrennt halten:
Sie können das Modell oder die Ansicht ändern, ohne die andere zu ändern. Möglicherweise müssen Sie den Controller aktualisieren, wenn Sie einen der beiden ändern. Dies ist jedoch Teil des Vorteils: Die Teile des Programms, die sich am wahrscheinlichsten ändern, sind im Controller konzentriert.
Modell und Ansicht können wiederverwendet werden. Beispielsweise könnten Sie dieselbe Schachbrettansicht mit einem RSS-Feed als Modell verwenden, um berühmte Spiele zu veranschaulichen. Sie können auch dasselbe Modell verwenden und die Ansicht durch eine webbasierte Oberfläche ersetzen.
Es ist einfach, Tests sowohl für das Modell als auch für die Ansicht zu schreiben, um sicherzustellen, dass sie ordnungsgemäß funktionieren.
Sowohl das Modell als auch die Ansicht können häufig die Vorteile von Standardteilen nutzen: Arrays, Karten, Mengen, Zeichenfolgen und andere Datencontainer für das Modell; Schaltflächen, Steuerelemente, Textfelder, Bildansichten, Tabellen und andere Elemente für die Ansicht.
quelle
Es gibt viele, viele verschiedene Möglichkeiten, dieses allgemeine Entwurfsmuster zu implementieren, aber die Grundidee besteht darin, die verschiedenen Belange nach Bedarf zu trennen. MVC ist eine nette Abstraktion in dem Sinne, dass:
Modell : Stellt die Daten dar, was auch immer dies bedeuten mag.
Ansicht : Stellt die Benutzeroberfläche dar, was auch immer dies bedeuten mag.
Steuerung : Stellt den Klebstoff dar, der bewirkt, dass das Modell und die Ansicht interagieren, was auch immer dies bedeuten mag
Es ist extrem flexibel, weil es nicht viel spezifiziert. Viele Leute verschwenden viel Bandbreite und diskutieren, was jedes Element bedeuten könnte, welche Namen stattdessen verwendet werden sollten und ob es wirklich 3 oder 2 oder 4 oder 5 Komponenten geben sollte gewisser Grad.
Die Idee ist, die verschiedenen "Brocken" der Logik zu trennen, damit sie sich nicht überlappen. Halten Sie Ihre Präsentationen zusammen, halten Sie Ihre Daten zusammen, halten Sie Ihre Logik zusammen, halten Sie Ihre Kommunikation zusammen. Und so weiter. In gewissem Maße ist es umso einfacher, interessante Dinge mit ihnen zu tun, je weniger sich diese Problembereiche überschneiden.
Das ist alles, worüber Sie sich wirklich Sorgen machen sollten.
quelle
Alles gute Antworten soweit. Meine zwei Cent sind, dass ich den Controller gerne als hauptsächlich aus Fragen wie Was und Wo aufgebaut betrachte.
erlaubt Ich bin nicht sicher, aber ich weiß, wo und wen ich fragen soll (das Modell).
Diese kleinen Schnipsel sind Beispiele dafür, wie ich mich an die Abstraktion und das Konzept zu erinnern versuche, die MVC zu vermitteln versucht. Was, wo und wie sind meine drei Hauptgedankenprozesse.
Was und wo => Controller Wie und wann => Modelle und Ansichten
Im Wesentlichen sind meine Controller-Aktionen in der Regel klein und kompakt und sehen beim Lesen manchmal wie Zeitverschwendung aus. Bei näherer Betrachtung agieren sie als Verkehrssignalgeber, leiten die verschiedenen Anfragen an die zuständigen Mitarbeiter weiter, erledigen jedoch keine der eigentlichen Arbeiten selbst.
quelle
Ein Controller kann dabei helfen, die Schnittstellen sowohl der Ansicht als auch des Modells zu abstrahieren, damit sie sich nicht direkt kennen müssen. Je weniger ein Objekt wissen muss, desto tragbarer und prüfbarer wird es.
Zum Beispiel könnte das Model eine andere Instanz von sich selbst über einen Controller abspielen. Oder ein vernetzter Controller könnte die Views-Objekte von zwei Spielern miteinander verbinden. Oder es könnte ein Turing-Test sein, bei dem niemand weiß, welcher.
quelle
Wenn Sie sich mit Ereignishandlern beschäftigen, kommt dies wirklich ins Spiel, aber Sie benötigen immer noch den Controller, um die Interaktionen zwischen der Ansicht und dem Modell zu handhaben. Idealerweise soll die Ansicht nichts über das Modell wissen. Denken Sie darüber nach, möchten Sie, dass ein JSP alle Datenbankaufrufe direkt durchführt? (Es sei denn, es handelt sich um eine Anmeldesuche.) Sie möchten, dass die Ansicht Daten rendert und keine Geschäftslogik enthält, es sei denn, es handelt sich um eine Ansichtsrenderlogik, die Geschäftslogik wird jedoch nicht beibehalten.
In GWT erhalten Sie mit MVP eine sauberere Trennung. In der Ansicht befindet sich überhaupt keine Geschäftslogik (wenn sie richtig ausgeführt wird). Der Präsentator fungiert als Controller und die Ansicht kennt das Modell nicht. Modelldaten werden einfach an die Ansicht übergeben.
quelle
Die Dokumentansicht (dh die Modellansicht) ist das Standardmodell für die meisten in MFC geschriebenen Windows-Apps, sodass sie in vielen Fällen funktionieren muss.
quelle
Sind Sie sich da sicher? (Zumindest wie ursprünglich beschrieben) Der Sinn des Modells ist es, das Domain-Modell zu sein. Die Ansicht soll dem Benutzer das Domain-Modell anzeigen. Der Controller soll den Low-Level-Eingang auf das High-Level-Modell abbilden. Soweit ich das beurteilen kann, handelt es sich um Folgendes: A) eine hohe Nutzung der SRP. B) Das Modell wurde als wichtiger Teil der App angesehen. Halten Sie daher unwichtige und schnell wechselnde Elemente von der App fern. C) leicht testbare (und skriptfähige) Geschäftslogik.
Stellen Sie sich vor, Sie möchten Ihr Schachprogramm für Blinde nutzbar machen, und tauschen die Ansicht gegen eine hörbare Version und eine Steuerung aus, die mit der Tastatur funktioniert. Angenommen, Sie möchten Spiele per E-Mail hinzufügen, fügen Sie einen Controller hinzu, der Text akzeptiert. Nettoversion des Spiels? Ein Controller, der Befehle von einem Socket akzeptiert, würde diese Aufgabe übernehmen. Fügen Sie eine schöne 3D-Darstellung hinzu, eine coole neue Ansicht. Keine Modelländerungen notwendig Schach ist immer noch Schach.
Wenn Sie Eingaben mit der Modelldarstellung mischen, verlieren Sie diese Fähigkeit. Plötzlich ist Schach nicht mehr Schach, sondern Schach mit einer Maus, die sich von Schach mit Tastatur oder Netzwerkverbindung unterscheidet.
quelle
Ich denke, MVC ist dumm, vielleicht funktioniert es in bestimmten Bereichen gut, aber persönlich sind selbst von mir geschriebene Websites nicht für MVC geeignet. Theres ein Grund, warum Sie Frontend, Backend und nie Datenbank-Ende oder etwas anderes Ende hören
IMO sollte es eine API (Backend) und die App geben, die die API (Frontend) verwendet. Ich denke, Sie könnten die GET-Anfrage den Controller (der einfach die Backend-API aufruft) und die HTML-Ansicht aufrufen, aber ich höre normalerweise keine Leute, die über die Ansicht als reine HTML- oder Modell-Backend-API sprechen.
IMO alles sollte eine solide API sein. Eigentlich müssen sie nicht solide sein (wie in sauber und gut gebaut), aber ihre Interna sollten privat bleiben und die App / Frontend / außerhalb der API sollte niemals die Datenbankverbindung sagen oder in der Lage sein, unformatierte Abfragen zu machen.
Nun, wenn Ihr Code / Design Kleber beinhaltet, ist es in Ordnung. Wenn es in Ihrem Schachspiel einige Markups gibt, die Sie bearbeiten können, um die Benutzeroberfläche zu gestalten, sammelt die Benutzeroberfläche die Koordinaten / Eingaben und ruft MovePiece (srcPosition, dstPostion) auf (dies kann einen Bool oder eine Aufzählung zurückgeben, um zu sagen, ob es sich um einen gültigen Zug handelt oder nicht ) und dein OK, wenn alle Logik im Modell ist, dann nenne es sicher MVC. Allerdings würde ich die Dinge immer noch nach Klassen und APIs organisieren und sicherstellen, dass es keine Kitchen-Sink-Klasse gibt, die alles berührt (noch APIs, die über alles Bescheid wissen müssen).
quelle
Stellen Sie sich einen Browser vor, der eine statische Webseite anzeigt. Das Modell ist das HTML. Die Ansicht ist das tatsächliche Ergebnis auf dem Bildschirm.
Fügen Sie nun etwas JavaScript hinzu. Das ist der Controller. Wenn der Benutzer auf eine Schaltfläche klickt oder etwas zieht, das das Ereignis an das JavaScript sendet, entscheidet er, was zu tun ist, und ändert das zugrunde liegende HTML (Modell). Der Browser / Renderer zeigt diese Änderungen auf dem Bildschirm an (Ansicht).
Möglicherweise wird auf eine andere Schaltfläche geklickt, das Ereignis wird an einen Handler (Controller) gesendet, und es kann dazu führen, dass weitere Daten an einen Webservice gesendet werden. Das Ergebnis wird dann zum HTML (Modell) hinzugefügt.
Der Controller reagiert auf Ereignisse und steuert, was sich im Modell und damit auf dem Bildschirm / in der Ansicht befindet.
Wenn Sie etwas zurücktreten, können Sie sich den gesamten Browser als Ansicht und den Server als Controller und die Daten als Modell vorstellen. Wenn der Benutzer auf eine Schaltfläche im Browser klickt, sammelt er Ressourcen als HTML-Seite (Modell) und sendet diese an den Browser, um sie anzuzeigen (Ansicht).
Im Server empfängt der 'Code' (Controller) unabhängig davon, ob es sich um asp, php oder java handelt, das Ereignis click und fragt eine Datenbank oder ein Dokumentrepository (Model) ab und erstellt HTML. Aus Sicht des Servers ist das Ergebnis aller Aktionen eine Ansicht (HTML) des zugrunde liegenden Datenspeichers (Modells). Aus Client-Sicht ist das Ergebnis der Anforderung an den Server jedoch das Modell (HTML).
Auch wenn Sie Ihr JavaScript in Ihrem HTML-Code oder Ihr PHP-Code in Ihrem HTML-Code durcheinander bringen, ist das Modell, die Ansicht und der Controller immer noch vorhanden. Auch wenn Sie sich Ihre Anfrage an einen Server und die Antwort vom Server als eine einfache Einbahnstraße vorstellen, gibt es immer noch ein Modell, eine Ansicht und einen Controller.
quelle
Meiner Erfahrung nach wird der Controller in einem herkömmlichen Desktop-MVC-GUI-Programm in die Ansicht eingeblendet. Die meisten Leute nehmen sich nicht die Zeit, eine Controller-Klasse herauszufiltern.
das vierköpfige buch sagt:
quelle