Heutzutage scheint jeder, der Webanwendungen erstellt, MVC für alles nutzen zu wollen. Es fällt mir jedoch schwer, mich von diesem Muster zu überzeugen. Ich verstehe die allgemeine Idee ist, die Backend-Logik vom Frontend zu trennen, das das Programm darstellt. Im Allgemeinen scheint es, dass die Ansichten immer in gewissem Maße vom Controller abhängen, was letztendlich vom Modell abhängt. Ich verstehe nicht, welchen Vorteil mir das Hinzufügen des Controllers bringt. Ich habe viel Hype darüber gelesen, wie Anwendungen so gestaltet werden sollten, aber vielleicht verstehe ich immer noch nicht, was wohin soll. Wann immer ich mit anderen über MVC spreche, scheint jeder eine andere Vorstellung davon zu haben, was in welche Kategorie gehört.
Warum sollte ich MVC verwenden? Was bringt mir MVC, wenn ich nur das Frontend von der Backend-Logik trenne? (Die meisten "Vorteile", die ich von diesem Muster sehe, werden nur durch die Trennung der Schnittstelle von der Implementierung erzielt und erklären nicht den Zweck, einen separaten "Controller" zu haben.)
quelle
Antworten:
Heh. Martin Fowler stimmt Ihrer Verwirrung über MVC zu:
Er gibt jedoch eine der überzeugenderen Erklärungen, was MVC motiviert:
Sie können den gesamten Artikel von Fowler hier lesen .
quelle
Ich glaube, das hängt stark von dem Problem ab, mit dem Sie sich befassen. Ich sehe die Trennung wie folgt:
Modell - wie stellen wir die Daten dar? Wie gehe ich zum Beispiel von meinen Objekten zu einem dauerhaften Speicher wie einer Datenbank -> wie speichere ich mein 'Benutzer'-Objekt in der Datenbank?
Controller - was mache ich? Dies ist die Handlung, die stattfindet und die auf konzeptioneller Ebene ausgeführt werden muss. In welchen Schritten muss ich beispielsweise einen Benutzer in Rechnung stellen? Hinweis: Dies kann sich auf eine beliebige Anzahl von Objekten auswirken, weiß jedoch nichts darüber, wie diese in der Datenbank gespeichert werden.
Ansicht - wie rendere ich das Ergebnis?
Das Problem, das ich sehe, ist, dass viele Webanwendungen eine verherrlichte CRUD-Schnittstelle (Create-Retrieve-Update-Delete) zu einer Datenbank sind. Das heißt, der Controller wird angewiesen, einen Benutzer hinzuzufügen, und das Modell wird einfach angewiesen, einen Benutzer hinzuzufügen. Es wird nichts gewonnen.
In Projekten, in denen die von Ihnen ausgeführten Aktionen nicht direkt auf Änderungen im Modell zutreffen, vereinfacht ein Controller das Leben erheblich und das System ist wartungsfreundlicher.
quelle
Das solltest du nicht.
Lassen Sie mich das umformulieren. Sie sollten eine Architektur verwenden, die die Logik von Ihren Ansichten trennt. Bei Bedarf sollten Sie eine Architektur verwenden, die einen Controller verwendet (z. B. MVC), wenn eine Logik erforderlich ist, die nicht unbedingt in ein Modell passt (z. B. URL-Chunks für das Tree Traversal Parsing).
Ich stamme von CI und Yii und fand, dass ein dedizierter Controller eine wirklich coole Idee ist. Bei der Entwicklung von Anwendungen mit geeigneten REST-Schnittstellen scheint sich jedoch die Notwendigkeit zu verringern, dass ein Controller nicht modellspezifische Logik handhabt. Bei der Umstellung auf Django und dann Pyramid (von denen keine vollständig der MVC-Architektur entspricht) stellte ich fest, dass der Controller keine erforderliche Komponente für die von mir erstellten Anwendungen war. Beachten Sie, dass beide Frameworks über "controller'ish" -Funktionen verfügen, z. B. URL-Dispatching in Pyramid, aber dies ist eine Konfigurationssache, keine Laufzeitsache (wie z. B. CController in Yii).
Am Ende des Tages ist es wirklich wichtig, den Blick von der Logik zu trennen. Dies räumt nicht nur in Bezug auf die Implementierung auf, sondern ermöglicht es auch FE / BE-Ingenieuren, parallel zu arbeiten (wenn sie in einer Teamumgebung arbeiten).
(Randnotiz: Ich entwickle Web-Apps nicht professionell, daher fehlt mir möglicherweise etwas.)
quelle
Ja, die Terminologie dazu ist ein Chaos. Es ist schwer darüber zu reden, weil man nie genau weiß , was jemand mit den Begriffen meint .
Was die Gründe für einen separaten Controller angeht, hängt der Grund möglicherweise davon ab, von welcher Controller-Version Sie sprechen.
Möglicherweise möchten Sie einen Controller, da die Ansicht beim Ausführen von Tests eine Reihe von Widgets enthält, die Sie nicht geschrieben haben und wahrscheinlich nicht testen möchten. Ja, Sie haben die Implementierung von der Vererbung getrennt, sodass Sie andere Dinge mit einem Stub oder Mock testen können. Wenn Sie jedoch Ihre konkrete Ansicht selbst testen, ist dies schwieriger. Wenn Sie einen Controller hatten, auf dem keine Widgets mit demselben Code ausgeführt wurden, können Sie dies direkt testen und müssen die Widgets möglicherweise nicht über ein Skript testen.
Für die anderen Versionen ist es meiner Meinung nach schwerer, einen konkreten Nutzen zu zeigen. Ich denke, es ist hauptsächlich ein Problem der Trennung von Bedenken - trennen Sie rein visuelle GUI-Bedenken von der Logik, die auf die GUI zutrifft, aber nicht Teil des Geschäftsmodells ist (z. B. Übersetzen von Aktualisierungen aus dem Modell, in die Widgets sichtbar sein sollen). In der Praxis sind die beiden Klassen jedoch wahrscheinlich so eng miteinander verbunden (auch wenn sie über Schnittstellen kommunizieren), dass es schwierig ist, sie zu einer Ansicht zusammenzuführen und zu prüfen, ob die Funktionalität wiederverwendbarer ist wenn sie gespalten wären.
quelle
Einfach ausgedrückt: Trennung von Bedenken. Abgesehen von all dem Gerede über die "richtige" Art, Dinge zu tun, saubereren Code zu haben usw. können Sie einfach sagen, dass MVC es Ihnen ermöglicht, Ihren Code einfacher wiederzuverwenden. Grundsätzlich programmieren Sie Ihre Modelle und Ihre Steuerungen und können sie undeutlich in einer Web-App, einer Desk-App, einem Service und an jedem Ort ohne großen Aufwand verwenden.
quelle
Nun, der Grund für die Verwendung einer MVC-Struktur zeigt sich in einem Branchen-Setup, in dem ein einzelner Arbeitsprozess und ein einzelnes Modell für die Entwicklung einer beliebigen Anwendung verwendet werden. Wenn das Projekt also von einem Modul einer Organisation in ein anderes übergeht, ist es viel einfacher, das Arbeitsszenario besser zu verstehen. Es beinhaltet Klarheit der Arbeit.
Während Sie als Einzelperson einen anderen Ansatz für Ihre Bewerbung haben würden, würden Sie, wenn Sie in einer kombinierten Art und Weise mit einem Mitarbeiter arbeiten, zuerst ein gemeinsam vereinbartes Modell zwischen den beiden (Ihnen und Ihrem Mitarbeiter) diskutieren und darauf aufbauen. In einem solchen Fall werden die Ihnen und Ihrem Mitarbeiter zugewiesenen Verantwortlichkeiten durch einen deutlichen Spielraum voneinander getrennt.
quelle
Ich denke, MVC wird nur als Schlagwort von Theoretikern verwendet, die Manager sind. Die derzeitige Iteration des Webs mit HTML5, das sich durch ein ansprechendes Design auszeichnet, und der Versuch, eine einzige Zeile der Datenbankprogrammierung zu erstellen, die im Web und auf einem iPhone funktioniert, bietet sich jedoch für die allgemeinen Ideen von MVC an. Die Web-Front-End-Technologie bewegt sich mit Jquery, neuen Iterationen der CSS-Steuerung, im wahrsten Sinne des Wortes mit Lichtgeschwindigkeit, während sich die Serverseite im Schneckentempo bewegt.
Letztendlich handelt es sich auf dem Server nur um Dienste oder "Applets", die Daten an das Front-End senden. Je nachdem, welchen Client Sie haben, werden diese Daten unterschiedlich verarbeitet und angezeigt. In diesem Sinne macht MVC Sinn.
In dieser Hinsicht glaube ich, dass die MVVM in der gegenwärtigen realen Welt ein wirklich besseres "Muster" ist, oder wie auch immer Sie es nennen möchten, als ein Controller, da ein Controller immer zum Modell zurückkehren muss, um die Ansicht zu ändern, und dies ist langsam . Im MVVM-Muster kann das ViewModel die Ansicht sofort aktualisieren. Darüber hinaus fördert das MVVM-Modell RESTful Design Principals IMHO.
quelle