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.I want the data in the DB to have a life and meaning beyond the application.
Was?Antworten:
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.
quelle
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.
quelle
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.the Domain Model (what's mapping to your database)
. Gute Antwort!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.
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.
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.
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'".
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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
quelle
Eigentlich ist es sehr einfach, "Modell" repräsentiert die Abstraktion für die Datenschnittstelle. Deswegen:
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 ).
quelle
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.
quelle
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.
quelle
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
ActiveRecord
einem beliebten ORM:Price
ist ein Feld in derhouses
Tabelle, das automatisch erkannt wirdActiveRecord
und das dem Objekt einen Getter und Setter hinzufügt. Wennsave
aufgerufen 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.
quelle
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
Überprüfen Sie dieses Diagramm:
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.
quelle
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 ...