| |||||||
Du magst keine Werbung? Wir auch nicht!
Einfach registrieren und die Werbung ist weg. Diese Nachricht sehen nur nicht registrierte Nutzer.
![]() |
| | LinkBack | Themen-Optionen | Ansicht |
| | #1 (permalink) |
| DeRailed Registriert seit: Sep 2006
Beiträge: 321
| Wieder einmal... ...MVC!
Hallo, ich habe beschlossen, mich einmal näher mit dem MVC-Pattern auseinanderzusetzen und habe deswegen einmal versucht, mit Papier und Bleistift die Architektur eines einfachen Flash-Gästebuchs zu erstellen. Dabei bin ich auf ein paar konzeptionelle Schwierigkeiten gestoßen. Angenommen ich habe ein abstraktes GuestbookModel, das implementierte Unterklassen wie z.B. XMLModel hat. Dieses Model wird von der "Hauptapplikation" erzeugt. Des weiteren gibt es noch eine GuestbookView, die die Einträge anzeigt und einen GuestbookController, der die Eingaben von der View bekommt und verarbeitet.
Bleibt noch zu sagen, dass ich in Sachen MVC wirklich ein Neuling bin; ich habe auch in anderen Sprachen noch nie bewusst damit gearbeitet. Nachdem ich gestern ein paar Stunden darüber nachgedacht habe, raucht mir noch immer der Kopf ![]() EDIT: Mist, im falschen Forum gepostet, sollte natürlich nach Softwarearchitektur... Geändert von klickverbot (19-12-2006 um 16:27 Uhr) |
| | |
| | #2 (permalink) |
| Perverted Hermit Registriert seit: Mar 2004 Ort: Delmenhorst
Beiträge: 12.147
|
Hm, ich bin mir nicht so ganz sicher, wer von uns beiden nun durcheinanderkommt. Ich würde zum Beispiel nicht von Views, Controller-View-Paar etc reden. Du hast einen View - diese View kann und soll verschiedene Daten anzeigen, aber auch eingeben udn an den Controller weitergeben. Die View ist losgelöst vom Controller und vom Model. Und das Modell sind auch nur Daten. Zu "wer erzeugt den View": Die Frage verstehe ich nciht ganz. Der Controller erwartet ja auch Eingaben vom View. Du musst deshalb nicht davon ausgehen, dass Komponenten erzeugt werden. Die einzelnen Komponenten kommunizieren über Schnittstellen/Protokoll. Du hast Verschiedene Arten Daten ein- und auszugeben. Zu "Wie erfährt die View, dass das Model eine Authentifikation benötigt?": Das Modell braucht keine Athentification sondern der Controller, der die Daten verarbeitet innerhalb der Anwendung. Das Modell sind nur Daten. Zu den Captchas: ich weiss net, was das genau ist, aber auch hier: Der Controller schickt eine Nachricht an die View, erwartet und bekommt einen Input und dann gehts weiter. Das würde ich so zu deinem Anliegen beisteuern. Ich würde die Captchas vielleicht erstmal weglassen... |
| | |
| | #3 (permalink) | ||||
| DeRailed Registriert seit: Sep 2006
Beiträge: 321
| Zitat:
Es muss ja auch auf der Client-Seite eine Model-Klasse bzw. zumindest einen Model-Connector geben, die den Zugriff bzw. die Zwischenspeicherung der Daten vom Server-Teil (im Normalfall wahrscheinlich PHP+MySQL) kapselt. Oder ist das im Normalfall anders? Zitat:
Zitat:
Meine Frage war darauf bezogen, dass ich mir gedacht habe, für das Anlegen eines neuen Eintrags wäre eine eigene View gut. Nicht aus Abstraktions- o.ä. Gründen, sondern einfach, weil ich in einer nicht MVC-Application wohl auch zwecks Ordnung und Übersicht eine eigene Klasse erstellen würde. Vielleicht ist es aber auch besser, es gibt nur eine einzige View, die als Fassade für zwei Unterklassen dient. Was meint ihr? Zitat:
Wenn ich jetzt, was ja auch gescheiter ist, Server und Client für das Layout jetzt einmal komplett weg lasse und so tue, als ob das Ding eine einzige (PHP-)Anwendung wäre, dann gehört die gesamte Captcha-Behandlung natürlich in den Controller. Aber ich war einfach davon "geblendet", dass der Controller für die Captcha-Kontrolle auch einen Server-Teil braucht (sonst wäre das GB ja anfällig für Direktzugriff über HTTP) Acja, Captchas sind z. B. die Bilder, die verzerrte Buchstaben enthalten, die du dann eingeben musst – bei Webanwendungen werden sie hauptsächlich dazu verwendet, (Spam-)Bots auszusperren. | ||||
| | |
| | #4 (permalink) | ||||||
| Perverted Hermit Registriert seit: Mar 2004 Ort: Delmenhorst
Beiträge: 12.147
| Zitat:
View im Flash sind die sichtbaren Aspekte... das, was auf der Bühne erscheint. Controller ist die Logik (ausgelagerter AS-Code vereinfacht die Anschauung) Zitat:
Zitat:
Zitat:
Ein neues Fenster ist eine Eigenschaft des Views, kein neuer View. Du verwechselst da was. Zitat:
Zitat:
| ||||||
| | |
| | #5 (permalink) | |||||
| DeRailed Registriert seit: Sep 2006
Beiträge: 321
| Zitat:
Zitat:
Zitat:
Zitat:
Außerdem stimmt es meines Wissens nach auch nicht, dass das Model überhaupt keine Logik enthalten darf. Siehe z.B. http://www.adobe.com/devnet/flash/ar...ontroller.html. In diesem Beispiel enthält das Model auch Logik – wo sollte sie sonst sein... Zitat:
| |||||
| | |
| | #6 (permalink) | |||||
| Perverted Hermit Registriert seit: Mar 2004 Ort: Delmenhorst
Beiträge: 12.147
| Zitat:
Zitat:
![]() Zitat:
Zitat:
Ich würde es so machen: Der View (Views bei verschiedenen Ausgabemedien) bietet eine visuelle Schnittstelle nach aussen an. Ausserdem beinhaltet der View Schnittstellen zum Controller, damit dieser Änderungen am Modell vornehmen kann. Ausserdem Schnittstellen zum Modell, um es anzuzeigen. Der Controller umfasst alles, was die interne Verarbeitung von Daten angeht. Schnittstellen zu Views für Inputs und Ausgaben des aktuelisierten Modells, falls dieses nicht zuvor persistent gespeichert wurde. Das Modell umfasst eine interne Representation von Daten und Schnittstellen zur Ausgabe an den View, sowie Schnittstellen zum Schreiben und Lesen für den Controller. Ausserdem natürlich evtl externe Datenquellen. Warum? Da es um flexibiltät geht, macht es nicht viel sinn, wenn externe Datenquellen, die Teil des Modells sind, Logik mitzugeben, die die internen Daten verarbeitet. Man will ja so flexible wie möglich mit den Daten sein, und wenn ich eine Datenquelle habe, die mir gleich Java-Objekte liefert, obwohl ich einen C-Controller habe, ist das Geschrei groß. Besser: mein Controller arbeitet die Rohdaten intern auf. So bekommt jeder Controller allgemein gültige Daten und kann die verarbeiten. Ich kann aber nicht leugnen, dass ich stark von der 3 Schicht Architektur beeinflust bin und ich vielleicht deswegen den MVC etwas anders interpretiere. Die schönste Analogie zu ähnlichen Architekturen sind Webservices... alles kommuniziert über allgemein gültige Protokolle. Zitat:
Solche Patterns lassen schon Spiel für Interpretationen... ich orientiere mich sehr stark an der drei Schichten Architektur: GUI, Business Logic, Data Sources... | |||||
| | |
| | #7 (permalink) | |
| DeRailed Registriert seit: Sep 2006
Beiträge: 321
| Zitat:
| |
| | |
| | #8 (permalink) |
| Perverted Hermit Registriert seit: Mar 2004 Ort: Delmenhorst
Beiträge: 12.147
|
Genau, entweder du machst es so, oder du baust für den Controller eine Adapterklasse, die diverse Datenquellen ansprechen kann um nur mit einem GuestbookModell zu arbeiten. In hinblick auf dynamisches Arbeiten hat meine Variante den Vorteil, dass ich ich der Adapterklasse abfragen kann, welche Datenquellen vorhanden sind und die gleich zum laden von Daten verwenden kann. Intern benutze ich dann konsequent nur ein GuestbookModell, dass ich trotzdem zur Laufzeit um Daten aus anderen Datenquellen erweitern kann (was der untenstehende Code nicht demonstriert, aber natürlich wäre es so ![]() ActionScript:
Du musst deinem GuestbookController im Code dagegen sagen, welches GuestbookModell er verwenden soll. Was bedeutet, wenn du eine neue Datenquelle benutzt, du eine neue Klasse schreiben muss und diese komplett in dein System einpflegen muss. Dieses ist aber unvernünftig, da die interne Representation der Daten genauso aussieht wie bei den anderen Klassen, Vererbung also gar nicht stattfindet, da du das Modell nicht spezialisierst. Die Daten fliessen nur anders in das System ein. Konzeptionell wird dein Ansatz spätestens dann unvernünftig, wenn du mit verschiedenen Datenquellen arbeitest. Nehmen wir an, du lädst Artikel von Ebay und Amazon in dein System. Du würdest dann ein AmazonArticleModell und ein EbayArticleModell haben. Zwei verschiedene Objekte, die du theoretisch über Wrapper und TypeCasts irgendwie miteinander verbinden müsstest, sofern du mit ihnen direkt im System arbeiten willst. Ein Umwandlung direkt nach dem Laden in ein Datenformat (Abstrakten Datentypen), erleichtert hingegen das interne arbeiten ungemein. ActionScript:
Geändert von Omega Psi (20-12-2006 um 08:37 Uhr) |
| | |
| | #9 (permalink) |
| helpQLODhelp Registriert seit: Feb 2002 Ort: Köln
Beiträge: 8.505
|
Interessanter Thread. Um das ganze etwas anschaulicher zu machen, habe ich mal ein sehr einfaches Gästebuch nach dem MVC Prinzip umgesetzt. www.bokelberg.de/download/guestbook_01.zip mfg. r
__________________ Ralf Bokelberg™ - Flex & Flash Consulting |
| | |
| | #10 (permalink) | ||
| DeRailed Registriert seit: Sep 2006
Beiträge: 321
| Zitat:
![]() Zitat:
Hier habe ich das einmal skizzenhaft dargestellt (ja, ich weiß, es gibt kein abstract usw.) ActionScript:
Nochmal zurück zu den Captchas: Wie würde ich sie eurer Meinung nach am besten integrieren? Wenn das Captcha jetzt ein reines clientside-Feature wäre, dann wäre der Fall klar (Überprüfung in den Controller, da das Captcha nichts mit den Daten an sich zu tun hat). Aber da ich jetzt einmal angenommen habe, dass diese Überprüfung serverseitig implementiert ist und die Flash-Anwendung bzw. jeder andere Client erst dann schreibend auf die Datenbank zugreifen kann, wenn das Captcha gelöst wurde, habe ich ein Problem. Natürlich müsste ich mir das bei einem konkreten Projekt noch genauer überprüfen, aber mir fällt im Moment keine gute andere Möglichkeit ein, Spam zu verhindern. Nur das .swf-File auf die Datenbank zugreifen zu lassen ist ja leider nicht so einfach möglich, da man 1. einfach den HTTP-Verkehr abhören kann und 2. eine Überprüfung im swf per se unsicher ist (Stichwort dekompilierbar, manipulierbar...) Eine Frage zu dem Entwurf von bockel: Du speicherst ja den Status (hinzufügen, anzeigen) der View im Model. Wenn ich jetzt eine View implementieren würde, bei der beides parallel möglich wäre (zum Beispiel ein zweigeteiltes Fenster), dann hätte ich ein Problem. Es gehört ja nicht wirklich zu der "Logik" eines Gästebuchs, dass es zwei verschiedene Modi (Hinzufügen und Anzeigen) hat und hat demnach meiner Meinung nach nicht wirklich was im Model zu suchen. Und noch was: Nehmen wir an, meine Gästebuchapplikation hätte mehrere Gästebücher, aus denen der Benutzer auswählen kann. Dann brauche ich ja eine eigene Navigation dafür. Eigentlich spräche nichts dagegen, dass als eine eigene View neben der Anzeige zu implementieren, oder? Der zugehörige Controller würde dann Model.setActiveBook() aufrufen, worauf das Model unter anderem die andere View benachrichtigen würde... 1 Portion Erleuchtung bitte^^ Geändert von klickverbot (20-12-2006 um 21:47 Uhr) | ||
| | |
| | #11 (permalink) |
| Perverted Hermit Registriert seit: Mar 2004 Ort: Delmenhorst
Beiträge: 12.147
|
Schick schick das Gästebuch. Ehrlich gesagt ist das das erste mal, dass ich Software nach MVC modelliert sehe. Sieht schick aus. Ich preferiere aber doch eher die 3, bzw mehr als 3 Schicht Architektur. Eine klare Trennung von GUI, Logik und Datenhaltung ist für mich der klare Vorteil. Da MVC anscheinend, je nach Beispiel, mal mehr mal weniger Logik für das Modell vorsieht, halte ich mich da lieber an Schnittstellen und Komponenten... Aber es ist ja nichts schlechtes! |
| | |
| | #12 (permalink) |
| Perverted Hermit Registriert seit: Mar 2004 Ort: Delmenhorst
Beiträge: 12.147
|
Hm, aber da frage ich dich einfach mal so direkt, wieviel Sinn eine solche Archtektur macht. Du kannst entweder ein Ebay- oder ein AmazonSearchmodel starten. Also, da würde ich sagen, zurück ans Reisbrett. Ich denke, auf sowas ziehlt eine MVC-Architektur nicht ab. Du müsstest dein Modell dann so aufbauen, dass es sowohl mit Amazon als auch Ebay arbeiten kann. Der Controller würde dann die Artikel entgegennehmen. Wenn ich es (deinen Code) nun richtig interpretiere, musst du ja deine Application jedesmal neu starten, wenn du ein anderes Model benutzen willst. Das wäre ja so, als wenn man deinen Mediaplayer jedesmal runterfahren muss, nur weil man dieser einen anderen Codec braucht... |
| | |
| | #13 (permalink) | |||
| Perverted Hermit Registriert seit: Mar 2004 Ort: Delmenhorst
Beiträge: 12.147
| Zitat:
Zitat:
Zitat:
Ich glaube du denkst bei einer View an ein Fenster, das erzeugt wird. Das kann nicht ganz richtig sein, da der Controller auf jedes Fenster reagieren muss... Deine herangehensweise lässt einen Schluss zu ein System zu, dass man soviele Views basteln kann, wie man lustig ist. Diese brauchen aber aber auch die entsprechenden Controller. Dem Controller soll es aber egal sein, was für ein Fenster er abhört, es geht nur um die Schnittstellen. Eine Applikation in 3 Komponenten aufzuteilen, macht sonst keinen Sinn. Betrachtest du alles was sichtbar und anklickbar ist als eine eigenständige View hättest du ein M(V * n)C... von den Controllern, die du anständigerweise mit implementieren müsstest ganz zu schweigen. Es handelt sich nur um ein Kozept, eine Architektur... nicht um ein Rezept, wie eine Applikation im Endeffekt aufgebaut sein muss (Anzahl der Fenster, Controller etc). | |||
| | |
| | #14 (permalink) |
| helpQLODhelp Registriert seit: Feb 2002 Ort: Köln
Beiträge: 8.505
|
Wg Captchas: Captchas würde ich so implementieren, dass die Antwort des Users an den Server geschickt wird und dann von dort ein Token zurückgeliefert wird, das weiterhin zum Schreiben gebraucht wird. Wg. des ViewStates im Model: Das Model kann viele verschiedene Aspekte haben. Es kommt immer drauf an, was die Views halt so brauchen. Ein View, der beides gleichzeitig anzeigt, könnte die ViewStates ja einfach ignorieren. Alles was State ist, gehört ins Model. In groesseren Applikationen könnte man das Model sicher weiter unterteilen. Wg. mehreren Gästebüchern: Genauso kannst du das machen. Das sollte ohne weiteres klappen. Wg. Mehrschichtarchitektur: Das Model ist ja jetzt sehr primitiv aufgebaut. Darunter kannst du dir noch beliebige Schichten vorstellen. Normalerweise benutze ich Flex/Flash als Client in J2EE Applikationen. Dabei ist praktisch das, was Struts und Konsorten als Client abbilden in den Flashclient gewandert. Darunter kannst du noch Schichten anhäufen ohne Ende. Jeder Kunde denkt darüber anders. mfg. r
__________________ Ralf Bokelberg™ - Flex & Flash Consulting |
| | |
| | #15 (permalink) |
| Neuer User Registriert seit: Oct 2006
Beiträge: 162
|
Wieso willst du denn die Logik in den Controller packen? Ich fand anfangs den Begriff Model auch immer total verwirrend, da man damit assoziert, dass er nur ein Datenmodell oder ähnliches darstellt. Und unter Controller stellt man sich den vor, der "das Sagen" hat. Aber eigentlich kontrolliert ja der Kontroller nur das was im View passiert. View Repräsentation des Models. Erhält den Zustand und die Daten die er benötigt vom Model Controller Nimmt die Eingabe des Benutzers an und stellt fest, was sie für das Modell bedeutet. Er trennt die Steuerungslogik vom View und entkoppelt den View vom Model. Der Controller implementiert Verhalten für den View, aber nie Anwendungslogik. Er ist der kluge Kopf, der die Aktionen vom View in Aktionen auf dm Model übersetzt. Das Model nimmt diese Aktionen an und implementiert die Anwendungslogik, die entscheidet, welche Reaktion auf diese Aktion angebracht ist. Der Controller muss vielleicht ein bisschen arbeiten, um zu entscheiden, welche Methodenaufrufe auf dem Model erforderlich sind, aber das kann man nicht als Anwendungslogik betrachten. Die Antwendungslogik ist der Code, der die Daten verwaltet und manipuliert und dieser kommt im Model vor. Model Enthält die gesamte Daten-, Zustands- und Anwendungslogik. Es kann Benachrichtigungen an den Beobachter senden. Also ich pack alles ins Model bzw. in die Modelebene. Und der Controller ist nur da um auf Interaktion zu reagieren und wenn es einfache Interaktionen sind, die für das Model nicht entscheidend sind, wie z.B. das leeren eines Textfeldes, dann macht er das und wenn es Aktionen sind, die am Model etwa s ändern, dann leitet er das an das Model weiter und bereitet das vielleicht vorher noch richtig aus, was ja dann sowas wäre wie "Text aus dem Textfeld auslesen und an die Model-Funktion reichen. |
| | |
![]() |
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
| |