Das Problem dabei MVC
ist, dass die Leute denken, dass die Ansicht, der Controller und das Modell so unabhängig wie möglich voneinander sein müssen. Sie denken nicht - eine Ansicht und ein Controller sind oft miteinander verflochten - als M(VC)
.
Der Controller ist der Eingabemechanismus der Benutzeroberfläche, der insbesondere bei GUIs häufig in der Ansicht verwickelt ist. Trotzdem wird die Ansicht ausgegeben und der Controller eingegeben. Eine Ansicht kann oft ohne einen entsprechenden Controller funktionieren, aber ein Controller ist ohne Ansicht normalerweise weitaus weniger nützlich. Benutzerfreundliche Controller verwenden die Ansicht, um die Benutzereingaben aussagekräftiger und intuitiver zu interpretieren. Dies macht es schwierig, das Controller-Konzept von der Ansicht zu trennen.
Stellen Sie sich einen funkgesteuerten Roboter auf einem Erkennungsfeld in einer versiegelten Box als Modell vor.
Das Modell dreht sich alles um Zustand und Zustandsübergänge ohne Konzept der Ausgabe (Anzeige) oder was die Zustandsübergänge auslöst. Ich kann die Position des Roboters auf dem Feld ermitteln und der Roboter weiß, wie er die Position wechselt (einen Schritt vorwärts / rückwärts / links / rechts). Ohne Ansicht oder Steuerung leicht vorstellbar, aber nichts Nützliches
Stellen Sie sich eine Ansicht ohne Controller vor, z. B. jemanden in einem anderen Raum im Netzwerk in einem anderen Raum, der die Position des Roboters als (x, y) -Koordinaten beobachtet, die über eine Bildlaufkonsole gestreamt werden. Diese Ansicht zeigt nur den Status des Modells an, aber dieser Typ hat keinen Controller. Auch diese Ansicht ist ohne Controller leicht vorstellbar.
Stellen Sie sich eine Steuerung ohne Sicht vor, z. B. jemanden, der in einem Schrank eingeschlossen ist und dessen Funksteuerung auf die Frequenz des Roboters abgestimmt ist. Dieser Controller sendet Eingaben und verursacht Zustandsübergänge, ohne zu wissen, was sie mit dem Modell tun (wenn überhaupt). Leicht vorstellbar, aber ohne Feedback aus der Ansicht nicht wirklich nützlich.
Die meisten benutzerfreundlichen Benutzeroberflächen koordinieren die Ansicht mit dem Controller, um eine intuitivere Benutzeroberfläche bereitzustellen. Stellen Sie sich beispielsweise eine Ansicht / Steuerung mit einem Touchscreen vor, der die aktuelle Position des Roboters in 2D anzeigt und es dem Benutzer ermöglicht, den Punkt auf dem Bildschirm zu berühren, der sich gerade vor dem Roboter befindet. Der Controller benötigt Details zur Ansicht, z. B. die Position und den Maßstab des Ansichtsfensters und die Pixelposition des berührten Punkts relativ zur Pixelposition des Roboters auf dem Bildschirm, um dies richtig zu interpretieren (im Gegensatz zu dem Mann, der mit im Schrank eingeschlossen ist) die Funksteuerung).
Habe ich deine Frage schon beantwortet? :-)
Der Controller ist alles, was Eingaben vom Benutzer entgegennimmt, mit denen das Modell in den Übergangszustand versetzt wird. Versuchen Sie, die Ansicht und den Controller getrennt zu halten, stellen Sie jedoch fest, dass sie häufig voneinander abhängig sind. Daher ist es in Ordnung, wenn die Grenze zwischen ihnen verschwommen ist, dh wenn Ansicht und Controller als separate Pakete nicht so sauber voneinander getrennt sind wie Sie wie, aber das ist okay. Möglicherweise müssen Sie akzeptieren, dass der Controller nicht sauber von der Ansicht getrennt wird, da die Ansicht vom Modell stammt.
... sollte eine Validierung usw. im Controller durchgeführt werden? Wenn ja, wie kann ich Fehlermeldungen an die Ansicht zurückmelden - sollte dies das Modell erneut durchlaufen oder sollte der Controller es einfach direkt an die Ansicht zurücksenden?
Was füge ich in den Controller ein, wenn die Validierung in der Ansicht erfolgt?
Ich sage, eine verknüpfte Ansicht und ein Controller sollten frei interagieren, ohne das Modell durchzugehen. Der Controller nimmt die Benutzereingaben entgegen und sollte die Validierung durchführen (möglicherweise unter Verwendung von Informationen aus dem Modell und / oder der Ansicht). Wenn die Validierung jedoch fehlschlägt, sollte der Controller in der Lage sein, die zugehörige Ansicht direkt zu aktualisieren (z. B. Fehlermeldung).
Der Härtetest besteht darin, sich zu fragen, ob eine unabhängige Ansicht (dh der Mann im anderen Raum, der die Roboterposition über das Netzwerk beobachtet) aufgrund eines Validierungsfehlers eines anderen (z. B. des Mannes im Schrank) etwas sehen sollte oder nicht versuchte den Roboter anzuweisen, das Feld zu verlassen). Im Allgemeinen lautet die Antwort nein - der Validierungsfehler hat den Zustandsübergang verhindert. Wenn es keine staatliche Transformation gab (der Roboter bewegte sich nicht), müssen die anderen Ansichten nicht mitgeteilt werden. Der Typ im Schrank hat einfach keine Rückmeldung erhalten, dass er versucht hat, einen illegalen Übergang zu verursachen (keine Ansicht - schlechte Benutzeroberfläche), und niemand sonst muss das wissen.
Wenn der Typ mit dem Touchscreen versuchte, den Roboter vom Feld zu schicken, erhielt er eine nette benutzerfreundliche Nachricht, in der er darum gebeten wurde, den Roboter nicht zu töten, indem er ihn vom Erkennungsfeld schickte, aber auch dies muss niemand anderes wissen.
Wenn andere Ansichten über diese Fehler Bescheid wissen müssen, sagen Sie effektiv, dass die Eingaben des Benutzers und alle daraus resultierenden Fehler Teil des Modells sind und das Ganze etwas komplizierter ist ...