Was ist die Verwendung von Model in MVC? Ist es wirklich nützlich?
Ich bin neu in diesem, so mit mir tragen. Ich habe mit einem MVC-framework in ein paar Projekte in letzter Zeit, und nach einer Weile, ich bin enttäuscht in der wahrgenommenen Nützlichkeit der "Modell" in MVC.
Bekomme ich die Nützlichkeit von Controllern und Views, ich weiß, dass die Trennung zwischen Präsentation und Logik ist wichtig, um den code wartbarer in die Zukunft, wenn auch nicht unbedingt schneller oder stabiler werden.
Wenn alle Logik sollte gesetzt werden in der Steuerung in Erster Linie, ich sehe keine Verwendung für das Modell, insbesondere die Active-Record. Wir haben bereits eine Sprache, die ist so robust und einfach zu verwenden, um die Kommunikation mit der Datenbank, habe ich Recht? Es heißt SQL. Für mich, wenn die Modelle umgesetzt werden, wie active-record, es die Nützlichkeit hängt davon ab, ob oder nicht Sie möchten, dass Ihre app so anpassen, dass in mehreren Datenbanken.
Also, was ich verlange ist, wenn Sie nur eine Datenbank auf, warum die Mühe mit Modellen und Active-Records? Warum nicht nur die Verwendung von SQL? Warum die zusätzliche Schicht von Komplexität? Habt Ihr irgendwelche Fallstudien/real-life-Geschichten, in denen Modelle tatsächlich Dinge besser machen kann als nur mit der database-Klasse und SQL-away?
Wieder, tut mir Leid, wenn ich zu sein scheinen so ignorant, aber ich weiß wirklich nicht, warum Modelle wichtig sind. Vielen Dank für die Beantwortung.
InformationsquelleAutor der Frage rickchristie | 2011-02-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erste, Sie sind der Annahme, dass ein Modell-Ebene unbedingt verwendet eine Art von ORM, um die abstrakte SQL entfernt. Das ist nicht wahr: Sie können ein Modell erstellen Schicht, die lose aus der Controller-Schicht, sondern eng gekoppelt an ein bestimmtes DBMS, und so vermeiden, mit einem full-featured ORM.
Gibt es einige ORM-Bibliotheken wie Hibernate (Java), NHibernate (.NET), Doctrine (PHP) oder ActiveRecord-Rails (Ruby) , wirklich kann erzeugen alle SQL-Anweisungen für Sie; aber wenn Sie denken, ORM unnötig ist, und Sie möchten, um zu definieren, werden alle SQL-statements von hand, verwenden Sie Sie nicht.
Immer noch, IMHO, das bedeutet NICHT bedeuten, sollten Sie einfach alle Ihre DB-bezogene Logik in die controller-Schicht. Dies wird als der "fat controller" - Ansatz, und es ist eine Straße, die führt oft zu aufgeblähten, wartbaren code. Sie können es verwenden, für einfache CRUD-Projekte, aber nichts darüber hinaus verlangen die Existenz einer wirklichen "Modell".
Sie scheinen zu kümmern, MVC. Bitte, Lesen Sie auch etwas über TDD. Ein weiser Mann sagte einmal:"legacy code ist code ohne tests". Wenn Sie lernen, die automatisierten unit-tests sind so wichtig wie der "real" - code, Sie werden verstehen, warum es so viele Ebenen in einem Unternehmen Anwendung, und warum Ihr Modell Schicht getrennt sein soll von der Steuerung. Ein block von code, der versucht, alles zu tun (Präsentation, Geschäftslogik, Daten-Persistenz) einfach nicht leicht getestet (noch nicht ausgetestet).
Bearbeiten
"Modell" ist ein wenig unscharf Begriff. Je nachdem, von wo aus Sie es betrachten, es kann bedeuten, etwas leicht anders. Zum Beispiel, PHP e-Ruby-Programmierer verwenden Häufig als ein synonym für eine Active Record, das ist nicht korrekt. Einige andere Entwickler scheinen zu glauben, dass ein "Modell" ist nur eine Art von DTO, das ist auch nicht richtig.
Ich lieber die definition des Modells wie in Wikipedia:
Also das Modell ist die größte, wichtigste Schicht in den meisten MVC-Anwendungen. Deshalb ist es in der Regel gliedert sich in sub-Ebenen: die Domäne, Service, Data Access und so weiter. Das Modell ist in der Regel ausgesetzt durch die Domain, weil es dort, wo finden Sie die Methoden, die in Ihrem controller-aufrufen wird. Aber die Data-Access-layer gehört zum "Modell" zu. Alles, was im Zusammenhang mit der Daten Persistenz und business-Logik gehört.
InformationsquelleAutor der Antwort rsenna
Es ist nicht ein unwissender Frage an alle! Nur die Tatsache, dass Sie Fragen, anstatt es einfach zu ignorieren, die ganzen MVC-Theorie und als Sie tun, bitte schön. 🙂
Deine Frage zu beantworten: konzeptionell-Modelle bieten einfach eine schöne Abstraktion für Ihre Daten. Anstatt zu denken, im Sinne von "wie Schreibe ich das inner join, um alle Felder, die ich brauche", Modelle aktivieren Sie denken in Bezug auf "wie sind meine Anwendung Objekte miteinander in Beziehung stehen, wie Sie interagieren und wie bekomme ich die Daten brauche ich von Ihnen".
In der gleichen Weise, dass die Ansichten und Steuerungen helfen Ihnen, separate Präsentation von Logik, Modelle helfen, Sie trennen die Anwendungslogik (aus Sicht des Benutzers, sowieso) von den details, wie und wo Ihre Daten tatsächlich kommt und wie es intern dargestellt.
Geben einem mehr spezifischen Beispiel (wenn auch nicht ganz realistisch): in der Theorie, könnten Sie schreiben Ihre ganze Anwendung in einer Weise, Sie holte alle Daten über SQL-Abfragen. Aber später erkannte man wollte einige noSQL (CouchDB, etc) Motor, weil Sie gebraucht horizontale Skalierung.
Mit Modellen (und einen Rahmen, können mit beiden Arten von Speicher, natürlich : -)), die Sie nicht haben, um sorgen über die details, wie all Ihre wichtigen Daten ist bereits vertreten in einer generischen Art und Weise durch Ihre Modelle, und beide Ansichten und Controller zu handeln, dass die Vertretung.
Ohne Sie, würden Sie wahrscheinlich haben, neu zu schreiben, ein großes Stück code, einfach zu passen Sie Ihre Daten abrufen, um das neue backend.
Und das ist nur auf der langweiligen Lagerung Teil. Mit reinem SQL, es ist viel schwieriger zu definieren, die Interaktionen zwischen der Anwendung von Objekten (also die business-Logik), weil Sie einfach nicht tun, dass in SQL (wahrscheinlich jedenfalls).
Es ist nicht eine perfekte Erklärung (weit von es), aber ich hoffe es hilft.
InformationsquelleAutor der Antwort João Neves
In den meisten realen Situationen, Daten, die vom Benutzer nicht direkt in der Datenbank.
Muss oft überprüft werden, gefiltert oder umgewandelt wird.
Die Rolle der model-Schicht ist in der Regel, um sicherzustellen, dass Daten kommt richtig in die backend-store (meistens Datenbank), indem Sie diese Vorgänge ausführen, die nicht in der Verantwortung der controller (skinny controller, fat model"), und nicht die Verantwortung für die Datenbank-engine selbst.
In anderen Worten, das Modell layer ist verantwortlich - oder `weiß' - wie die Daten behandelt werden sollen.
Meisten modernen MVC-frameworks bieten Methoden zum angeben von Verträgen über die Gültigkeit der Daten Anforderungen, wie Schienen.
Hier ist ein Beispiel aus http://biodegradablegeek.com/2008/02/introduction-to-validations-validation-error-handling-in-rails/:
Hier mehrfach die Gültigkeit der Daten Anforderungen können nicht behandelt werden, indem Sie die Datenbank, und sollte nicht behandelt werden, im Controller, weil jede änderung in diesen Anforderungen kann der code an mehreren stellen.
Daher, das Modell ist der beste Ort, um sicherzustellen, dass Daten zusammenhängend ist für Ihre domain.
Es gibt eine Menge mehr über ihn gesagt werden, aber ich fühlte, wie die Beseitigung der eine Punkt, der wichtig erscheint mir, motiviert durch praktische Erfahrungen 🙂
InformationsquelleAutor der Antwort SirDarius
Den Modellen enthalten sollte, alle Ihre Logik. Der controller ist nur dafür verantwortlich mit Logik im Zusammenhang mit Benutzer-Interaktion. Alle domain-Funktionen (was ist bekannt als "business-Logik") in das Modell und die Entkopplung von controller-code. So können Sie erreichen eine bessere Trennung von Bedenken, und die code-Wiederverwendbarkeit.
Zum Beispiel, sagen wir, Sie schreiben eine Anwendung, um Benutzern die Eingabe von Informationen über sich und erhalten Diät recomandations.
Einerseits, setzen Sie code für die Umwandlung Nutzer zur Verfügung gestellten Daten in eine Liste der Diät recomandations im Modell Teil. Dies beinhaltet die Datenbank zugreifen, aber auch alle Berechnungen , algorithmen und Verarbeitung in Bezug auf das problem in Frage (problem domain).
Auf der anderen Seite, setzen Sie den code zum anmelden der Benutzer in einem Formular anzeigen, sammeln Sie die form der Daten, die Validierung im controller. Auf diese Weise wurde beispielsweise könnten Sie später hinzufügen einer api in Ihre app (mit unterschiedlichen code für die Authentifizierung immer die Daten des Nutzers, Validierung etc). und die Wiederverwendung der code zum generieren der Ergebnisse (aus dem Modell).
Dies ist nur ein Beispiel von dem, was das Modell gut ist.
InformationsquelleAutor der Antwort matei
Ich beziehen sich immer auf das Modell zu den Daten-unabhängig davon, wo es ist oder wie es dargestellt wird. Im MVC-V zeigt Daten und C-handles ändern. Selbst wenn Sie alle Daten auf dem Bildschirm präsentiert in einer HashMap im eigenen controller; HashMap wird als das Modell.
InformationsquelleAutor der Antwort Vinod R