Warum Ansicht und Controller (Web) entkoppeln?

8

Warum können wir sie nicht auf dieselbe Seite setzen, wie jede Aktion mit ihrer Ansicht gepaart? Verwenden Sie keine Codeinsel, sondern den Controller-Code oben und den Code unten? Was sind die Probleme bei diesem Ansatz?

Mit MVC beziehe ich mich auf Frameworks wie ASP.NET MVC und Ruby on Rails, und ich habe den Eindruck, dass V und C tatsächlich die UI-Ebene sind.

Andy
quelle

Antworten:

5

Der Grund, warum sie im Allgemeinen entkoppelt sind, liegt darin, dass Sie möchten, dass Ihre Ansicht einen Controller verwendet, um an Ihr Modell zu gelangen. Die Architektur sollte es Ihnen jedoch ermöglichen, eine Ansicht durch eine andere zu ersetzen, ohne die Geschäftslogik ändern zu müssen (dh das Objektmodell oder wie diese Objekte abgerufen werden).

Wenn Sie Ihren Controller nicht direkt an die Ansicht binden, ist es später viel einfacher, andere Funktionen wie Import / Export hinzuzufügen, mit denen der Controller / das Modell direkt verwendet werden kann, ohne auf eine Benutzeroberfläche angewiesen zu sein.

Ein weiterer Vorteil, wenn so viel Code wie möglich aus der Benutzeroberfläche entfernt wird, besteht darin, dass Benutzeroberflächen viel schwieriger zu testen sind als die dahinter liegende Business-Schicht. Indem Sie so viel wie möglich von der Ansicht selbst trennen, können Sie viel mehr Komponententests schreiben, um sicherzustellen, dass Ihre Steuerung / Ihr Modell und Ihre Anwendungslogik korrekt sind.

DXM
quelle
Für den Import / Export benötigen Sie überhaupt keine Ansicht, sodass Sie nichts entkoppeln müssen. Zum Testen können Sie weiterhin einen Logiktest für die Aktion / Ansicht ausführen. Das einzige Problem, das ich sehe, ist das Laden des Ansichtscodes, den Sie nicht testen müssen, aber Sie können dies leicht umgehen.
Andy
Für den Import / Export benötigen Sie überhaupt keine Ansicht. Wenn Ihr Controller nicht von Ihrer Ansicht entkoppelt ist, warum sollten Sie dann Ansichtscode ausführen, wenn der Import / Export möglicherweise nicht einmal webbasiert ist. Selbst mit Webseiten können Sie mehr als eine Ansicht in demselben Modell haben (dh eine andere Asp-Seite, eine andere Klasse). Wenn Sie Ihren Controller nicht entkoppeln, duplizieren Sie diesen Code in verschiedenen Ansichten.
DXM
Wenn es keine Ansicht gibt, gibt es keine Ansicht, unabhängig davon, ob entkoppelt oder nicht.
Andy
Ich dachte, Ihre Frage war "Warum Controller von der Ansicht entkoppeln". Wenn der Import / Export auf den Controller zugreifen muss, um zum Objektmodell zu gelangen, wie kann er dies tun, ohne Ihre Ansicht zu instanziieren? Ohne Entkopplung instanziieren Sie Ansichtscode, unabhängig davon, ob jemand HTML rendert oder nicht. Oder schlagen Sie vor, den Controller-Code innerhalb der Import / Export-Funktionalität zu duplizieren?
DXM
1
Ihr ursprünglicher Beitrag: "Warum können wir sie nicht auf dieselbe Seite setzen?" - Sie haben also eine asp.net-Seite, die HTML rendert und Ihre Modelldaten präsentiert. Auf dieser Seite haben Sie Ihre VC in eine Klasse eingeteilt. Jetzt erhalten Sie die Anforderung, dass Ihre Anwendung den Import / Export unterstützen muss (nicht von dieser Seite, nur allgemein). Wenn eine vollständig separate Import / Export-Logik Zugriff auf die Steuerung benötigt, woher bezieht sie diese? Oder planen Sie, Ihre gesamte Anwendung in dieselbe Seitenklasse zu stellen? Was ist, wenn Sie den Export offline ausführen möchten (dh lokal auf einer Serverbox außerhalb des Webservers)?
DXM
4
  • Der Controller verarbeitet die Geschäftslogik, die sich von Zeit zu Zeit ändern kann, und die Ansicht kann je nach Anforderung unverändert bleiben.

  • Das Umgekehrte gilt auch.

  • Designer und Entwickler müssen in der Lage sein, unabhängig voneinander an demselben Projekt zu arbeiten.

Ein schöner Beitrag: http://mashable.com/2011/11/12/designer-collaboration-strategies/

  • Das gesamte System wird wartbarer. Das Lösen von Fehlern wird durch den entkoppelten Ansatz einfacher.

  • Webstandards mit Front-End-Technologien ändern sich rasant. Stellen Sie sich ein Unternehmen vor, das beschließt, alle Front-End-Technologien auf HTML5, Dart usw. zu migrieren. Eine gekoppelte Ansicht und ein gekoppelter Controller wären ein Albtraum!

SHOUBHIK BOSE
quelle
Zunächst und für die meisten sollte Geschäftslogik im Modell sein. Zweitens ist die Ansicht voller Code wie foreach und helfer, ein Grafikdesigner würde sich sicherlich nicht damit befassen wollen. Wenn er sich damit befassen möchte, ist er tatsächlich ein UI-Programmierer, was der Controller zu seinem Anliegen macht. Was HTML5 betrifft, besteht der größte Teil des HTML-Codes aus einem Layoutmechanismus, HTML-Hilfsprogrammen und Teilansichten (die wie Hilfsprogramme aussehen). Es spielt also keine Rolle, ob die Ansicht gekoppelt ist, Sie ändern die Ansicht selbst nicht für HTML5 .
Andy
@Andy Youy bat um eine Unterscheidung zwischen C und V ... Aus dieser Perspektive behandelt C die Geschäftslogik ebenso wie die Modelle.
Yannis
3

Sie müssen die beiden natürlich nicht trennen. Wenn Ansicht und Steuerung jedoch unabhängig sind, kann jede Benutzeroberfläche verwendet werden. Sie können den Controller beispielsweise über eine Konsole, Sockets, ein Web oder eine Desktop-Oberfläche verwenden. Mit anderen Worten, Sie können die Wiederverwendung von Code erhöhen.

perreal
quelle
Ich bezog mich auf die Webentwicklung, bei der die Benutzeroberfläche tatsächlich die Kombination aus Ansicht und Controller ist, sodass Sie nicht nur die Ansicht mit einer neuen Benutzeroberfläche austauschen können.
Andy
3
@Andy - Sie könnten sicher entscheiden, dass Sie eine native iOS- und Android-App für die Website haben möchten, die Sie entwickeln. Anstatt die Dinge noch einmal erledigen zu müssen, können Sie einfach Ihre Controller anrufen und dann eine separate Ansicht auf dem iOS / Android-Gerät haben, um den Controller wiederzuverwenden.
Jetti
@ Jetti das ist ein guter Punkt.
Andy