Wo ist das M in MVC?


14

Ich versuche, meine Anwendung in MVC umzugestalten, aber ich bleibe beim M-Teil.

In einer datenbankgestützten App ist das Modell im App-Code implementiert, oder?

Aber was ist dann in der Datenbank - ist das nicht auch das Modell?

(Ich verwende die Datenbank nicht als einfachen Objektspeicher. Die Daten in der Datenbank sind ein Unternehmens-Asset.)


I'm not using the database as a simple object store. Ich vermute, das bedeutet eine gewisse Geschäftslogik in der Datenbank in Form von gespeicherten Prozeduren. In der Theorie geht das gegen MVC, aber in der Praxis spielt es keine Rolle.
Yannis

@YannisRizos - es gibt BL in der DB, aber damit meine ich, dass die Daten in der DB über die Anwendung hinaus Bestand und Bedeutung haben sollen.

3
I want the data in the DB to have a life and meaning beyond the application.Was?
Yannis

2
@YannisRizos - Ich würde mich auf jeden Fall über Hilfe bei der Überarbeitung dieser Aussage freuen. Daten sind ein Unternehmensvermögen, oder? Es gehört nicht zur App - daher darf die App kein verrücktes denormalisiertes Modell erstellen, das es für die App sehr einfach macht, wenn dies die Wiederverwendung der Daten aus anderen Apps sehr schwierig macht. Irgendwelche Vorschläge?

1
Das ist kein Problem, wenn es ein Format für etwas gibt, das freigegeben werden muss, dann wird dies Teil der Anforderungen für das Speicherformat. Alles, was es in der Zukunft in einem anderen Format benötigt, kann eine ETL-Aufgabe haben oder in die DAL umwandeln.
StuperUser

Antworten:


46

Ja, sowohl das Modell im Code als auch in der Datenbank sind das "Modell".

Das Modell hat mit dem zu tun, was Ihre Anwendung "IST", und die Steuerung ist das, was sie "tut". Jeder Code, der sich mit der direkten Persistenz der Datenbank befasst, wird als Modell betrachtet.

Hinweis: MVC ist ein Muster , überlegen Sie es also nicht. Es ist einfach, MVC auf die richtige Art und Weise zu erledigen, aber am Ende des Tages ist es nur eine Denkweise! Es bedeutet, dass Ihre Geschäftslogik nicht in der Datenbank und auf der Benutzeroberfläche angezeigt wird - fertig. Vor MVC haben die Benutzer die gesamte Geschäftslogik auf ihren Webseiten abgelegt, wenn sie sich auf dem Server befinden sollte, oder sie haben eine Reihe von Skripten in der Datenbank, die die Geschäftslogik zusammen mit dem Persistenzcode ausführen. MVC wurde ins Leben gerufen, um die Leute dazu zu bringen, so zu denken, dass ihr Code wiederverwendbar wird. Lassen Sie sich also nicht zu sehr auf die Details ein.


15
Also aus der Sicht von C und V, dass es eine Datenbank gibt, ist nur ein Implementierungsdetail von M?

Bestimmt. Schön formuliert.
Herby

3
@MattFenwick Aus der Sicht von C und V gibt es keine Datenbank. Sie verwenden die Datenbank mehr als nur als Datenspeicher. In MVC-Begriffen ist eine Datenbank nur ein Datenspeicher. Das ist aber völlig in Ordnung, wenn es zu Ihrer Anwendung passt.
Yannis

5
+1 für "nicht überdenken MVC"
Javier

2
"Halten Sie Ihre Geschäftslogik aus der Datenbank und der Benutzeroberfläche heraus" - dies
David Murdoch

17

Trygve Reenskaug schrieb 1978 die ersten Arbeiten, in denen das MVC-Muster beschrieben wurde. Das Modell in seiner Beschreibung war das Objektmodell, das Objekte, Phänomene und Konzepte der realen Welt darstellt. In Ihrem Szenario einer datenbankgestützten Anwendung ist das Modell eine Projektion Ihrer Daten. Vereinfacht ausgedrückt handelt es sich bei dem Modell um die Klassen und ihre Beziehungen, mit denen sich Ihre Anwendung befasst.

In der Praxis werden in MVC normalerweise zwei Modelle verwendet: das Domänenmodell (was Ihrer Datenbank zugeordnet ist) und das Anwendungsmodell (in der heutigen Terminologie auch als Ansichtsmodell bezeichnet). Das Anwendungsmodell ist eine Projektion des Domänenmodells, die auch ansichtsspezifische Daten zum Rendern der Ansicht enthält. Dieser Ansatz wird als MMVC bezeichnet . Der Controller interagiert direkt mit dem Domänenmodell und präsentiert der Ansicht ein Anwendungsmodell. Im MVVM-Muster werden das Anwendungsmodell und der Controller kombiniert.


+1: Diese Antwort gefällt mir am besten. The model is a projection of your data.Die Datenbank soll die Daten auf die effizienteste Weise für den Zugriff und die Indizierung speichern. Das Modell sollte sich stattdessen an der Geschäftsdomäne orientieren.
Joel Etherton

Ich habe eine Sekunde gebraucht, um zu analysieren the Domain Model (what's mapping to your database). Gute Antwort!

2
+1 Dies ist eine großartige Beschreibung der verschiedenen Geschmacksrichtungen, zu denen MVC entwickelt hat.
Ryan Hayes

Danke Leute. Ich habe mich beim Schreiben meines Buches intensiv mit diesen Dingen beschäftigt. Froh, dass es Sinn macht!
Michael Brown

3
  1. Sie benötigen keine Datenbank für MVC. Wenn Ihr Modell zufällig mit der Datenbank kommuniziert, ist das großartig. Es könnte sich auch selbst als Flatfile oder gar nicht persistieren.

  2. Im Modell werden Daten in Ihrer Anwendung gespeichert. Sie möchten das Modell auch für Berechnungen und Validierungen seiner Daten verwenden. Sie haben beispielsweise ein FinancePayment-Modell mit Eigenschaften wie Zinssatz, Laufzeit und Prinzip. Sie können Ihrem Modell eine getMonthlyPayment () -Methode hinzufügen, um die monatliche Zahlung zu berechnen. Das möchten Sie nicht im Controller oder in der Ansicht tun.

  3. Die Ansicht sollte einigermaßen dumm sein, entweder überhaupt keine Logik aufweisen oder nur eine einfache Datenbindung verwenden (siehe Muster für die passive Ansicht und die Überwachung von Controllern auf Martin Fowlers Website ). Die Ansicht löst Ereignisse aus, wenn der Benutzer Aufgaben ausführt, z. B. das Klicken auf eine Schaltfläche.

  4. Der Controller ist für die Verarbeitung von Ereignissen (Ausführen von Code, wenn der Benutzer auf die Schaltfläche Speichern klickt) sowie für das Festlegen von Modelleigenschaften verantwortlich und weist das Modell an, sich selbst zu laden und zu speichern (wenn Persistenz verwendet wird). Der Controller sollte keine Berechnungen für die Modelldaten durchführen. Im Controller können Sie jedoch einige Berechnungen für die Ansicht ausführen, z. B. "wenn model.profit () <0, dann widget.colour = 'red'".

  5. Sie sollten in der Lage sein, zu einer Befehlszeilenversion Ihrer Anwendung zu wechseln, ohne die Modelle zu ändern und ohne die Funktionalität der Modelle zu verlieren.

ein. Sie sollten wahrscheinlich in der Lage sein, zu einer mobilen Version Ihrer Anwendung (im Gegensatz zu einer Desktop-Version) zu wechseln, indem Sie nur die Ansichten (und nicht die Controller oder Modelle) wechseln. Sie sollten in der Lage sein, Ihre Modelle und Controller ohne ein GUI-Testframework zu testen.


Direkt am! Das ist sehr klar.

2

Modell ist der Code, der eine Verbindung zu V und C im Frontend und zum permanenten Speicher (kann von Dateien bis zu SQL / NoSQL-Datenbanken reichen) im Backend hat. Es ist nicht nur der Code, der von db geladen und in db gespeichert wird (was eines der Missverständnisse des Modells ist), es ist der Code, der tatsächlich die gesamte "Domain" -Arbeit erledigt - wählt, filtert, ändert, berechnet, entscheidet über die Daten. Enthält die gesamte Nicht-UI-Logik der Anwendung.


Die Rohdaten, die Sie persistent haben möchten. In jeder Organisation, die am besten zu Ihrem Modell passt. Das Modell ist eine API, die Ihre Anwendungslogik zum Leben erweckt. Diese Datenbank ist der Speicher für die (nicht lebenden) Daten. Wenn es für Ihre App möglich ist (ich weiß nicht, um welche Art von App es sich handelt), versuchen Sie, sie als "datenbankgestützte App" zu betrachten, sondern nur als "App", die eine Datenbank als Methode verwendet Moduldaten zu speichern. Viele Probleme ergeben sich aus der "Ikonisierung" der Datenbank - sie ist nichts weiter als ein Datenspeicher für das Modell. Sie können es wegwerfen, umstrukturieren oder ersetzen, wenn es hilft.
Herby

(oben gilt nur für Szenarien, in denen Daten in db nicht mit einer anderen Anwendung geteilt werden)
herby

Ich entschuldige mich für die schlechte Wortwahl in meinem Kommentar - ich wollte damit sagen, dass ich nicht sicher bin, was in Bezug auf MVC in der Datenbank enthalten ist . Befindet sich die Datenbank außerhalb von MVC? Ist es Teil des Modells? Ist es ein Teil von V oder C (wahrscheinlich nicht, aber Sie verstehen den Punkt).

Aha. Sie haben wahrscheinlich aus meiner Antwort abgeleitet, dass Sie darin einen Teil des Modells sehen können, der dazu dient, die Anwendungsdaten zu erhalten, die der Code aus dem Modell verarbeitet. (Ich sehe den EDIT): Wenn diese Datenbank etwas ist, das die Anwendung überleben muss, dann betrachten Sie die Datenbank als den externen Dienst, mit dem das Modell kommunizieren muss, holen Sie Daten zur Berechnung und senden Sie auch einige zurück.
Herby

Im Extremfall, wenn Business - Logik in der DB selbst ist, können Sie sehr dünnes Modell, das hauptsächlich Relais an die DB, oder sogar sagen , dass db ist Ihr Modell (aber dann soll es hat alle die Logik).
Herby

2

Nehmen Sie eine sehr vereinfachende und idealistische Sichtweise.

Das Modell wird im Allgemeinen als Modell der Domäne (grob gesagt des Unternehmens) und nicht als Modell der Daten angesehen. Diese mögen ähnlich aussehen, sind aber nicht vollständig miteinander verbunden.

Die Ansicht sollte ein Modell des Anwendungs-Frontends und der Controller ein Modell des Flusses von einer Ansicht zur anderen sein.

Geschäftslogik sollte vollständig im Modell gekapselt sein, egal ob in der Datenbank oder im Code. Obwohl einige Geschäftslogiken in der Ansicht oder im Controller wiederholt werden können, sollte es aus verschiedenen Gründen möglich (und sicher) sein, diese beiden Komponenten vollständig zu entfernen und ein anderes Front-End an seine Stelle zu setzen.


1

Nach meinem Verständnis ist MVC nur die Beschreibung des Architekturmusters Ihrer Client-Anwendung. Das Bild hier in Wikipedia zeigt nur Folgendes:

http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

Wenn Sie Teile Ihrer Anwendung in "gespeicherten Prozeduren" implementiert haben, kann dieser Datenbankcode natürlich auch Teil des Modells oder sogar des Controllers sein (je nachdem, was der Code tut). Ist dies jedoch nicht der Fall, befindet sich die Datenbank eindeutig "außerhalb von MVC", so wie Sie es angegeben haben.


1
But then, what is in the database -- is that not also the model?

Nein ist es nicht. " Das Modell verwaltet das Verhalten und die Daten der Anwendungsdomäne". Häufig bindet sich das Modell in eine Datenbank ein, dies ist jedoch in keiner Weise erforderlich. Das Modell ist eine neue Ebene zwischen Ihrer Anwendung und der Datenbank. Das Backend kann aus einer Reihe von Mock-Objekten, XML oder anderen Elementen bestehen, die die Datenpersistenz unterstützen.

Durch die Entkopplung der Ebenen erhalten Sie eine wesentlich größere Flexibilität, um bessere Unit-Test-Methoden anzuwenden, und können den Code unter anderem besser verwalten (EG SQL wird durch Oracle ersetzt).

Das gleiche gilt für den Controller. MVC definiert den Controller als einen Mittelmann zwischen den beiden Ebenen. In MVC ist keine "Business-Schicht" definiert. Sie fügen vielmehr Ihre eigenen hinzu. MVC kapselt nicht alle Ebenen, die zum Erstellen der meisten Anwendungen erforderlich sind. Es ist nur eine allgemeine Richtlinie für die Grundstruktur.

Diese Trennungen sind der Schlüssel, um die Umkehrung der Steuerung in die Funktion zu ermöglichen.


+1 für eine ausgezeichnete und sehr informative Antwort; obwohl ich vorschlagen würde, dass der letzte Satz Erläuterung verdient. IoC ist nicht unbedingt so weithin bekannt und bekannt, daher kann es ein wenig Verwirrung stiften. Eine wirklich nützliche Erklärung dessen, was Sie damit meinen, würde wahrscheinlich den Rahmen einer vernünftigen SE-Antwort sprengen, aber sie ist mir aufgesprungen.
Adam Crossland

Wenn Sie jedoch Ihre Geschäftslogik in gespeicherte Prozeduren einfügen, umfasst die Datenbank das Modell. (Persönlich würde ich diesen Ansatz nicht empfehlen.)
Roy Tinker

1
@ Roy Tinker - Nein, das spielt keine Rolle. Das Modell ist konzeptionell getrennt. Es wird Entitäten geben, die sich irgendwo innerhalb der Ebene in die Datenbank integrieren. Diese Entitäten sollten von anderen Entitäten, die innerhalb des Modells existieren und über andere Beziehungen verfügen (z. B. ein Mock), entkoppelt bleiben. Der Controller sollte das Modell so anrufen, dass er nicht weiß, wie und woher die Daten stammen. Vielmehr sollte diese Bestimmung mit Abhängigkeitsinjektion und IoC (im Grunde genommen ist es eine Schnittstelle, die an verschiedene Backends, Mocking oder eine DB gebunden werden kann) erfolgen.
P.Brian.Mackey

1

Die Datenbank ist ein Implementierungsdetail des Modells. Das Modell sollte ein vollständiges Domänenmodell sein und Daten und Prozesse kombinieren. Die Trennung sollte zwischen Unterschieden und nicht zwischen einem Prozess und den Daten erfolgen, die sich auf diesen Prozess beziehen.

Siehe auch: http://martinfowler.com/bliki/AnemicDomainModel.html


0

Eigentlich ist es sehr einfach, "Modell" repräsentiert die Abstraktion für die Datenschnittstelle. Deswegen:

  • Datenbanken werden als Teil des Modells betrachtet , nicht jedoch das Modell selbst
  • Die Daten des Models können aus Datenbanken, Dateien, Webdiensten stammen oder sogar verspottet werden.
  • Modellklassen in MVC, HMVC oder ähnlichen Frameworks sollten Abfragen speichern (siehe "Fett - Modell, dünn Controller" Prinzip [ 1 ] [ 2 ] [ 3 ])

Und - wenn ich recht habe - wenn jemand auf Modelle außerhalb des MVC-Kontexts verweist, bezieht sich dies höchstwahrscheinlich auf die Struktur der Daten (dh das Schema ).


0

Ich denke, das M enthält einige Logik und speichert Daten in DB. Die Steuerung ruft auf, welches Modul ausgeführt werden soll, und dieses Modul führt die Logik aus und speichert die Daten in der Datenbank (möglicherweise mit persistenter Schicht). Anschließend gibt dieses Modul den Wert an V zurück.


0

Das M (odel) in der MVC sollte das Modell des Geschäfts / der Domäne an einem einzigen Ort erfassen .

Dies sollte im Idealfall sowohl die Geschäftsregeln der Domain als auch deren Struktur einschließen .

Der C (Controller) sollte sich im Idealfall nur darum kümmern, die Informationen des Geschäftsmodells auf die Präsentation (z. B. die Ansicht) zu übertragen und Benutzereingaben von V (Ansicht) zu erfassen, um Änderungen im Status des Modells auszulösen.

Die Datenbankschicht befasst sich nur mit der Beständigkeit des Modellzustands zu einem bestimmten Zeitpunkt (oder sollte dies eher nur tun).

Als solches gehört es weder zum Modell - noch zum Controller - Teil des MVC - Musters, sondern ist ein völlig eigenständiges Anliegen, das implizit implementiert werden kann, indem Änderungen am Modell (als Funktion der Fassade, die das MVC - Muster bereitstellt) transparent beibehalten werden Interaktionen mit Ihrem Modell mit dem Controller) oder wie es meistens gemacht wird, explizit von Controller aufgerufen, nachdem Mutationen am Modell vorgenommen wurden.


0

Das Modell in einer idealen Welt sollte nur Geschäftslogik enthalten, es modelliert ein reales Objekt wie ein Haus. In fast allen Fällen muss das Modell seine Daten jedoch in einem gewissen Umfang speichern.

Interaktionen zwischen dem Modell und den gespeicherten Daten können entweder auf einer separaten Datenebene oder direkt im Modell stattfinden, was bei Verwendung eines ORM (Object Relational Mapper) der Fall ist. Mit anderen Worten, entweder stellt das Modell eine direkte Verbindung zur Datenbank her oder es übergibt seine Daten an ein anderes "Datenzugriff" -Objekt, das eine Verbindung zur Datenbank herstellt.

Ein ORM (Object Relation Mapper) ordnet Felder in der Datenbanktabelle den Attributen Ihres Modellobjekts zu und stellt Getter und Setter bereit. In diesem Fall gibt es keine separate Datenschicht und das Modell ist direkt für die Speicherung seiner Daten verantwortlich.

Hier ist ein Ruby-Beispiel mit ActiveRecordeinem beliebten ORM:

class House < ActiveRecord::Base
end

house = House.new
house.price = 120000
house.save

Priceist ein Feld in der housesTabelle, das automatisch erkannt wird ActiveRecordund das dem Objekt einen Getter und Setter hinzufügt. Wenn saveaufgerufen wird, bleibt der Wert des Preisattributs in der Datenbank erhalten.

Aus meiner Sicht ist der Vorteil einer Datenschicht, dass Sie einen Punkt erhalten, an dem Sie die Daten manipulieren können, bevor sie im Modell ankommen. Das Modell hat weniger Sorgen, es hat weniger Verantwortlichkeiten. Beispielsweise müssen Sie möglicherweise Daten aus mehreren nicht kompatiblen Datenquellen kombinieren. Dies ist etwas, das ein ORM nicht einfach handhaben kann.

Der Hauptvorteil ist eine weitere Abstraktionsebene, die verwaltet werden muss. Wenn Sie sie nicht benötigen, kümmern Sie sich nicht darum, sie einfach zu halten. Weniger bewegliche Teile, weniger Fehler.


-1

Ja, du hast recht.

(Model View Controller)

Eine Architektur zum Erstellen von Anwendungen, die Daten (Modell) von der Benutzeroberfläche (Ansicht) und der Verarbeitung (Steuerung) trennen.

In der Praxis werden MVC-Ansichten und -Controller häufig zu einem einzigen Objekt kombiniert, da sie eng miteinander verbunden sind. Laut MSDN

Die Steuerung interpretiert die Maus- und Tastatureingaben des Benutzers und informiert das Modell und / oder the view to change as appropriate.

Überprüfen Sie dieses Diagramm:

Bildbeschreibung hier eingeben

Beispielsweise validiert der Controller-Code eine Datenanforderung und veranlasst, dass sie in einer Ansicht zurückgegeben wird. View-Controller-Objekte sind nur an ein Modell gebunden. jedoch,a model can have many view-controller objects associated with it.


4
In practice, MVC views and controllers are often combined into a single object because they are closely related.Wenn Sie das tun, tun Sie es falsch ...
Yannis

Woher kommt das Diagramm? Und woher kommt die Definition? Bitte kopieren Sie nicht einfach Inhalte aus dem Internet, ohne sie richtig zuzuordnen.
Yannis

@ Yannis Rizos - Er zitiert MS-Dokumentation. Es ist hier ein bisschen aus dem Zusammenhang geraten, aber sie sagen, dass Nicht-Web-Anwendungen oft eine Kopplung von Ansicht / Steuerung haben, aber Web-Anwendungen haben eine sehr klare Unterscheidung. Dies ist wahrscheinlich einer der Gründe, warum MS MVC nicht für seine Windows-Apps (stattdessen MVVM) pusht, sondern nur für Web-Apps. msdn.microsoft.com/en-us/library/ff649643.aspx
P.Brian.Mackey

1
@ P.Brian.Mackey Ich vermutete, dass MS irgendwie dahintersteckt: P
yannis

Ich habe Ihre Antwort so bearbeitet, dass sie den bereitgestellten Link @ P.Brian.Mackey enthält. Es ist völlig in Ordnung, externe Quellen zu zitieren, aber Sie müssen Links zu diesen Quellen einfügen. Auch MVVM ist MVC sehr ähnlich, aber es ist nicht dasselbe Muster. In MVC sollten Ansichten und Controller niemals zu einem einzigen Objekt kombiniert werden ...
yannis
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.