Hallo, hab eben mal diesen hier angelesen: http://r.je/views-are-not-templates.html Ich fand die Seite echt gut und verständlich. Auch das "Hello World" fand ich sehr schön: http://r.je/mvc-in-php.html Allerdings sagte mir mein Kollege in der Arbeit, dass hier gegen MVC verstoßen wird... Wer hat denn nun recht? Viele Grüße, Peter
Es wird nicht unbedingt gegen MVC verstoßen, allerdings greift der Controller "direkt" auf die "Daten" im Modell zu. Das ist eher unüblich, da man davon ausgehen sollte das weder View noch Controller die dem Modell unterliegende Datenstruktur (in diesem Fall einen String) kennen. Das Modell bietet normalerweise Funktionen an (was hier overdressed wäre), die einem Controller die Möglichkeit geben Daten zu verändern oder darauf zu zugreifen. Solltest du weitere Informationen zu den Grundstrukturen von MVC suchen schau dir mal die Model-View Architektur von Qt an. Dort nennt man den Controller Delegate aber ansonsten ist die Struktur gleich. Vorteil ist, dass ein Model (hier in C++) immer von QAbstractItemModel abgeleitet wird. Die Funktionen data() und setData() müssen durch den Programmierer eines neuen Modells implementiert werden. Dann kann jede View mit beliebigem Delegate auf das Modell zugreifen auch wenn die Zugrunde liegende Datenstruktur beim Programmieren von View bzw. Controller nicht bekannt war. Gerade dieser Sachverhalt ist die Stärke von MVC. Gruß lowlevel
Hallo lowlevel, ja, Beispiele gibts viele, wo auf MVC gesetzt wird. Aber ich habe das Problem, nicht zu wissen, was denn auf jeden Fall in MVC verboten ist :-( Und das am besten noch aus zitierbaren Quellen...
Vom M aufs V zugreifen ist eher unüblich... Verboten ist schon ein starkes Wort. Aber es gibt noch nen Leitspruch: Fat Models, Thin Controllers Heißt, möglichst viel Businesslogik kommt in die Models.
Hallo Peter, ich denke verboten ist in MVC nichts. MVC ist eher eine Herangehensweise an das Problem (unterschiedliche) Daten sinnvoll zu speichern und darzustellen. Quellen findest du z.B. hier: http://qt-project.org/doc/qt-5.0/guibooks.html#design-patterns dort wird auf Design Patterns verwiesen, was oft in Zusammenhang mit MVC genannt wird.
Die MVC-Anwendungen, die ich so geschrieben habe und schreibe, arbeiten
teils mit Views, die direkt auf das Model zugreiffen und teils nicht.
Beides funktioniert sehr gut, so lange man in der Lage ist, zu erkennen,
wann das eine sinnvoll ist und wann das andere:
- Bei einigen Anwendungen, die ich geschrieben habe, und bei denen das
View direkt auf das Model zugreift, konnte angenommen werden, dass die
Modelle hinreichend simpel, konform mit den "business requirements" und
über die Zeit stabil sind und das auch bleiben werden. Bei diesen
Anwendungen hätte ich Kollegen, die mir weiss machen wollten, dass das
View nicht mit dem business model reden darf, einfach dazu aufgefordert,
die nötige Separation selbst zu implementieren. Spätestens dann, wenn
auch diese Kollegen gemerkt hätten, dass man im Grunde nur bestehende
Datenstrukturen zu 95% kopiert um hier eine vermeintliche "Trennung von
Zuständigkeiten" zu erreichen, wären diese auch still geworden. (Die
letzten 5% sind dann Dinge, die man mit einer Hand voll Hilfsfunktionen
bestens abbilden konnte, ohne dass das irgendeinen negativen Einfluss
auf die Softwarearchitektur gehabt hätte.) Insofern finde ich das Dogma,
dass das View das Model prinzipiell nicht kennen darf (bzw. nicht mit
diesem reden darf) einfach nur quatsch. Das funktioniert an der Uni,
aber nicht im wahrem Leben.
- Speziell bei Web-Anwendungen gibt es bei Verwendung des
MVC-Architekturmusters die Besonderheit, dass eine wesentliche Stärke
von MVC nicht im klassischen Sinne verfügbar ist. In einer
Desktop-Applikation hat man oft das Spiel: Controller verändert Model ->
Model sendet Event über die Veränderung -> das View (das einen Listener
für Veränderungen des Models registriert hat) ändert als Reaktion auf
die Veränderung seine Darstellung. Bei altbackenen Web-Anwendungen ist
diese Reaktion des Views oft nicht in dieser Form möglich, nämlich dann
nicht, wenn der Client (Browser) nur dumpfes HTML-Rendering macht. Bei
modernen Web-Anwendungen, bei denen ein relevanter Teil der Software
clientseitig läuft, hat man aber meist eh kein einfaches MVC-Dreieck
mehr, sondern eher zwei auf eine bestimmte Art und Weise gekoppelte
Dreiecke. Man findet man dann MVC oder verwandte Strukturen sowohl auf
der Serverseite als auch auf der Clientseite. Die Gesamtstruktur sieht
dann so aus: Serverseitig hat man MVC, allerdings ist das View dann ein
Webservice, dass nur noch die aus dem Model extrahierten Daten in irgend
einer Form enthält. Der Client nimmt diese Daten in Empfang, bildet sie
auf das clientseitige Model ab und dann läuft das MVC-Dreieck auf dem
Client weiter. In dieser Konstellation hat man dann ein clientseitiges
View, dass in der Tat nicht mehr mit dem "echten" (= serverseitigen)
Businessmodel redet. Das ist auch ok so und hat unter Anderem den
Vorteil, dass man das clientseitige Modell vom serverseitigen Model
entkoppelt hat und sich insgesamt eine schöne Trennschicht ergibt. Das
geht schon in die Richtung, dass das endgültige (clientseitige) View
nicht mehr mit dem (serverseitigem) Originalmodell redet (es sitzt ja
der Webservice und das clientseitige Model dazwischen.)
- Wenn man nun wieder zur klassischen Desktop-Anwendung zurückkommt,
erhält man eine ähnliche Struktur durch sogenannte Proxy Models. Das
sind Modelle, die unabhängig vom Business Model sind, aber die selben
Daten und Zusammenhänge im Rahmen von den Anforderungen eines oder
mehrerer Views abbilden. Qt schreibt dazu: "Proxy models are components
that behave like ordinary models from the perspective of a view, and
access data from source models on behalf of that view." Das geht ja nun
klar in die Richtung, die Deine werten Kollegen propagieren! Allerdings
bildet ein Proxy Model nicht nur die Daten seines "Source Models" ab,
sondern agiert auch als Mediator zwischen dem "Source Model" und dem
View bezüglich der Events, die das "Source Model" sendet. Damit erhält
man in der Desktop-Anwendung bezüglich der Relation zwischen Model und
View die Struktur: Business Model <-> Proxy Model -> View (<->
Controller). In Web-Anwendungen hilft natürlich auch ein Proxy Model
nicht über die Tatsache hinweg, dass der Weg der direkten
Benachrichtigung (mittels Events) über Änderungen des Business Models
zum finalen (clientseitigen) View nicht möglich ist. Aber wie schon
gesagt: Die im vorangegangenen Abschnitte beschriebene Struktur für
Web-Anwendungen ist in gewissen Grenzen vergleichbar mit dem, was ich
gerade eben für Desktop-Anwendungen beschrieben habe: Das finale
(clientseitige) View hat keinen unmittelbaren Kontakt mehr zum
ursprünglichen (serverseitigen) Model. In der Web-Anwendung entsteht
eine zum Proxy Model ähnliche Struktur durch das serverseitige View
(Webservice) + das clientseititge Model.
- Da man in einer Web-Anwendung ja nun eh nicht die Möglichkeit hat,
Events auf Grund einer Änderung am Business Model direkt an das
clientseitige View zu kommunizieren, kann man Proxy Models gut und gerne
zu einer funktionslosen Datenstruktur verkümmern lassen. Damit nehmen
die Proxy Models genau den Platz ein, den Deine Kollegen ach so gerne
sehen wollen. Was für Web-Anwendungen in der Praxis funktioniert, ist
allerdings für Desktop-Anwendungen eine arge Einschränkung. Dort hat ein
vollwertiges Proxy-Model, dass auch die Mediatorenrolle für Events des
echten Models übernimmt, aus meiner Sicht enorme Vorteile. Proxy Models
erlauben es, View und Business Model ("echtes Modell") voneinander zu
entkoppeln, und dennoch MVC-Anwendungen effizent entwickeln zu können.
- Meine persönlichen Meinung nach hat es sich aus rein praktischen
Gründen selbst rein auf der Serverseite als attrakiv herausgestellt, das
Business Model vom (serverseitigen) View (egal ob das nun eine JSP-Seite
oder ein Webservice ist) zu entkoppeln. Webservices benutzen zumeist
eigene Datenstrukturen, die im Idealfall neutraler als das tatsächliche
Business Model ausgeführt sind (und z.B. per XML Schema vom Architekten
vorgegeben sind). Bei Technologien wie JSP hat man die Risiken, dass
durch diese ineffizient arbeiten, weil z.B. wiederholte teure Abfragen
auf das Business Model passieren, die man besser nur 1x ausführen und
als vorbereitetes Ergebnis zur Verfügung stellen sollte. Außerdem war
und ist der Frontendentwickler schon immer ein Dorn im Auge des
Backend-Enwtwicklers, und der Backendentwickler der gängigen Clichees
hatte noch nie was von all den lustigen aber auch klugen und innovativen
Technologien im Frontendbereich verstanden. Dieses menschliche und auch
die tatsächlichen technischen Probleme haben manche Softwarearchitekten
zum Anlass genommen um das Dogma ausgegeben, dass selbst ein
serverseitiges View nicht direkt mit dem Business Model reden darf (*,
s.u.). Für viele Anwendungsfälle ist das auch absolut sinnvoll, vor
allem in Umfeld von Web-Anwendungen, da hier, wie bereits mehrmals
erwähnt, ein für klassisches MVC eh eine wesentliche Stärke nicht
nutzbar ist, nämlich dass Event, dass direkt oder indirekt (via Proxy
Model) vom Model zum View geschickt wird.
Insgesamt finde ich die auf den vom TO genannten Seiten ausgesprochene
Kritik an bestimmten Entwicklungsmodellen absolut sinnvoll. Eine der
Stärken von klassischem MVC ist die Eigenständigkeit des Views, dass
selbst Herrscher über die Art und Aktualisierung der Darstellung der vom
Model verwalteten Daten ist. Ein Ansatz mit einem Proxy Model, dass als
Mediator zwischen Business Model und einem oder mehreren bestimmten
Views arbeitet halte ich für allemal sinnvoller, als die Datenextraktion
von Modelldaten in die Controller zu stopfen. Bie Web-Anwendungen
verhält es sich meiner Meinung nach etwas anders, da man hier
typischerweise das klassische MVC (mit dem Vorteil von Events vom Model
an das View) nicht 100% zur Anwendung bringen kann. Dem muss man -
zumindest außerhalb der Universitäten - Rechnung tragen durch eine
Anpassung der tatsächlich implementierten Architektur.
Späte Antwort, langer Text :-)
(*) Schuld daran sind für mich als Java-Entwickler unter Anderem auch
die vielen sogenannten "JEE-Tutorials", die einem suggerieren, dass
JSP-Seiten ja ein ach so praktischer Ort sind, um Elemente von Model,
Controller und das gesamte View an einem Punkt zu verschmelzen. Leider
gibt es immernoch Entwickler, die das für voll nehmen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.