Zurück   Flashforum > Flash > ActionScript > Softwarearchitektur und Entwurfsmuster

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 19-12-2006, 16:23   #1 (permalink)
DeRailed
 
Benutzerbild von klickverbot
 
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.
  • Was passiert, wenn der Benutzer einen neuen Eintrag erstellen will? Wahrscheinlich wird dann eine neue View erzeugt, weil ja auch die ganzen UI-Elemente usw. wechseln. Aber wer erzeugt die View? Das ganze wird ja dadurch ausgelöst, dass der Benutzer einen Knopf der View drückt, die dann das Ereignis an den Controller weiterleitet. Erzeugt dieser dann ein neues Controller-View-Paar?
  • Was ist mit Sachen wie z.B. Captchas zur Spam-Verhinderung? Damit das GuestbookModel neue Daten am Server eintragen darf, muss der Benutzer ein Captcha lösen. Dieses Captcha muss von der View angezeigt werden und der Controller muss es verarbeiten (überprüfen).
    Andererseits passt das ganze Captcha ja nicht wirklich in das GuestbookModel, weil:
    1. Eine andere Implementation des Models, z.B. LocalDatabaseModel könnte ja die ganze Captcha-Authentifikation gar nicht benötigen.
    2. Von der Abstraktionsebene passt das Captcha nicht zum Rest des Models – das Captcha gehört ja weder zum Gästebuch noch zu einem spezifischen Eintrag.
    3. Wie erfährt die View, dass das Model eine Authentifikation benötigt?
  • Was ist mit Fehlern, die bei Update bzw. Abgleich des Models mit der serverseitigen Datenbank auftreten? Werden die Views einfach über ein Ereignis darüber informiert? Eigentlich passt es ja genau so wenig zu der Abstraktionsebene. Oder kommen in das Model einfach alle Daten der Applikation hinein (was ich nicht glaube)?

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)
klickverbot ist offline   Mit Zitat antworten
Alt 19-12-2006, 16:48   #2 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
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...
Omega Psi ist offline   Mit Zitat antworten
Alt 19-12-2006, 18:51   #3 (permalink)
DeRailed
 
Benutzerbild von klickverbot
 
Registriert seit: Sep 2006
Beiträge: 321
Zitat:
Zitat von Omega Psi
Hm,
ich bin mir nicht so ganz sicher, wer von uns beiden nun durcheinanderkommt.
Das liegt wahrscheinlich daran, dass mir noch nicht so ganz klar ist, wie MVC im Bezug auf eine Flash-Anwendung aussieht, die sowohl einen Client- als auch einen Server-Teil hat.

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 von Omega Psi
Das würde ich so zu deinem Anliegen beisteuern. Ich würde die Captchas vielleicht erstmal weglassen...
Ich will ja jetzt kein Programm coden (wer weiß, vielleicht wird aber noch was draus), sondern nur die Architektur auf Papier entwerfen und alle Probleme bzw. Fragen, die sich mir stellen, lösen. Es hat jetzt keinen Sinn wenn ich sage: Das Problem lasse ich jetzt einfach weg; ich werde sowieso nie MVC-Gästebuch programmieren, das eine Captcha-Überprüfung enthält. Die Implementierung ist sicher nicht mein Problem.

Zitat:
Zitat von Omega Psi
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.
Das ist mir schon klar. Aber sofern ich das Pattern verstanden habe, hat jede View auch ihren eigenen Controller.
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:
Zitat von Omega Psi
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.
Wenn man es so betrachtet, was rein auf das Problem bezogen auch logisch erscheint, dann hat man damit keine Probleme. Nur habe ich irgendwie automatisch angenommen, dass sich auf Server-Seite ausschließlich das Model-Backend befindet.
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.
klickverbot ist offline   Mit Zitat antworten
Alt 19-12-2006, 19:12   #4 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.147
Zitat:
Zitat von klickverbot Beitrag anzeigen
Das liegt wahrscheinlich daran, dass mir noch nicht so ganz klar ist, wie MVC im Bezug auf eine Flash-Anwendung aussieht, die sowohl einen Client- als auch einen Server-Teil hat.
MVC sieht für alle Anwendungen gleich aus, sonst macht es keinen Sinn, das Ding als Designpattern zu netzen...

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:
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?
Nein, das ist Konzeptionell nicht ganz richtig. Der Controller übernimmt auch die interne Umstrukturierung der Daten. Sonst hättest du 2 Modells und 2 Controller.


Zitat:
Ich will ja jetzt kein Programm coden (wer weiß, vielleicht wird aber noch was draus), sondern nur die Architektur auf Papier entwerfen und alle Probleme bzw. Fragen, die sich mir stellen, lösen. Es hat jetzt keinen Sinn wenn ich sage: Das Problem lasse ich jetzt einfach weg; ich werde sowieso nie MVC-Gästebuch programmieren, das eine Captcha-Überprüfung enthält. Die Implementierung ist sicher nicht mein Problem.
Captchaprüfung gehört zum Controller.


Zitat:
Das ist mir schon klar. Aber sofern ich das Pattern verstanden habe, hat jede View auch ihren eigenen Controller.
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?
Nein, dann würde das anders aussehen. Dann würder jeder Controller auch ein eigenes Model in Anspruch nehmen können.

Ein neues Fenster ist eine Eigenschaft des Views, kein neuer View. Du verwechselst da was.


Zitat:
Wenn man es so betrachtet, was rein auf das Problem bezogen auch logisch erscheint, dann hat man damit keine Probleme. Nur habe ich irgendwie automatisch angenommen, dass sich auf Server-Seite ausschließlich das Model-Backend befindet.
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)
Server Logik + AS Logik bilden den Controller.

Zitat:
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.
Ah, alles klaro, danke
Omega Psi ist offline   Mit Zitat antworten
Alt 19-12-2006, 20:56   #5 (permalink)
DeRailed
 
Benutzerbild von klickverbot
 
Registriert seit: Sep 2006
Beiträge: 321
Zitat:
Zitat von Omega Psi
MVC sieht für alle Anwendungen gleich aus, sonst macht es keinen Sinn, das Ding als Designpattern zu netzen...
Jaja, das ist mir schon klar. Was ich eigentlich damit meinte: Ich bin mir nicht ganz im Klaren darüber, wie sich die Interaktion mit dem Server in das MVC-Pattern einfügt...

Zitat:
Zitat von Omega Psi
View im Flash sind die sichtbaren Aspekte... das, was auf der Bühne erscheint. Controller ist die Logik (ausgelagerter AS-Code vereinfacht die Anschauung)
Danke, das hätte ich nicht so treffend formulieren können [vorsicht ironie...]

Zitat:
Zitat von Omega Psi
Nein, das ist Konzeptionell nicht ganz richtig. Der Controller übernimmt auch die interne Umstrukturierung der Daten. Sonst hättest du 2 Modells und 2 Controller.
Ich bin mir da nicht so sicher, ob du hier Recht hast bzw. meine Frage richtig verstanden hast. Nehmen wir einmal an, ich Programmiere ein Gästebuch, das vollständig auf dem Client im Flash Player läuft. Dann habe ich View, Controller und ein Model, das die Daten lokal speichert. Wenn ich jetzt daraus eine Anwendung mit Datanbank-Backend machen will, dann muss ich nur das Model ersetzen. Wenn die Datenbank jetzt auf einem Webserver liegt und ich sie durch PHP abfrage, dann kann das auch nicht viel Unterschied machen; das Model fragt seine Daten halt aus der Datenbank ab bzw. sendet die Änderungen intern auch an die Datenbank. Davon dürften ja View und Controller nichts mitbekommen – sonst hätte das Pattern keinen Sinn.

Zitat:
Zitat von Omega Psi
Captchaprüfung gehört zum Controller.
Wie ich im vorigen Post schon geschrieben habe: Wenn es eine rein lokale Anwendung wäre, dann wäre mir das klar. Ich frage mich nur, wie ich das überhaupt integrieren könnte. Das wäre nämlich das einzige Stück Logik überhaupt serverseitig, ist aber leider nötig; sonst könnte ja jeder das Skript einfach im Webbrowser aufrufen und das Guestbook flooden. Aber auch wenn ich jetzt die Captcha-Prüfung wegmache und bspw. eine Zeitbeschränkung serverseitig einführe, dann muss das Model ja Logik beinhalten, um das abzudecken. Andererseits ist das, was ich hier schreibe, an sich schon ein Widerspruch zu dem, dass das Model einfach durch andere Varianten (z.B. lokal) ersetzbar ist. Vielleicht wäre es also besser, dem Model einfach eine Methode mitzugeben, die zurückliefert, ob gerade ein Eintrag hinzugefügt werden kann. Diese Methode würde bei einem LocalModel zwar immer true zurückzugeben, aber erscheint mir halbwegs passend.
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:
Zitat von Omega Psi
Ein neues Fenster ist eine Eigenschaft des Views, kein neuer View. Du verwechselst da was.
Vielleicht habe ich das wirklich verwechselt... Ich habe mir einfach gedacht, wenn ich zum Eintrag erstellen komplett andere Steuerelemente usw. habe, kann ich das Ganze gleich als zweite View auslegen. Aber stimmt, logischer ist es sicher anders. Ein Problem weniger
klickverbot ist offline   Mit Zitat antworten
Alt 19-12-2006, 21:56   #6 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.147
Zitat:
Zitat von klickverbot Beitrag anzeigen
Jaja, das ist mir schon klar. Was ich eigentlich damit meinte: Ich bin mir nicht ganz im Klaren darüber, wie sich die Interaktion mit dem Server in das MVC-Pattern einfügt...
  • View: Flash Frontend
  • Controller: Actionscript + PHP Logik
  • Modell: Interne Datenstrukturen (DB-Backend + Datenstrukturen in Flash)
Du kannst dich ja theoretisch entscheiden, in wieweit du deinen Code auf Client- und Serverseite verlagerst. Eine Komplette Representation auf Clientseite ist genau so denkbar wie eine komplette Logik auf Serverseite. Wichtig ist nur, dass es Schnittstellen für den View gibt, um die Datenanzuzeigen.

Zitat:
Danke, das hätte ich nicht so treffend formulieren können [vorsicht ironie...]
Keine Ursache


Zitat:
Ich bin mir da nicht so sicher, ob du hier Recht hast bzw. meine Frage richtig verstanden hast. Nehmen wir einmal an, ich Programmiere ein Gästebuch, das vollständig auf dem Client im Flash Player läuft. Dann habe ich View, Controller und ein Model, das die Daten lokal speichert. Wenn ich jetzt daraus eine Anwendung mit Datanbank-Backend machen will, dann muss ich nur das Model ersetzen. Wenn die Datenbank jetzt auf einem Webserver liegt und ich sie durch PHP abfrage, dann kann das auch nicht viel Unterschied machen; das Model fragt seine Daten halt aus der Datenbank ab bzw. sendet die Änderungen intern auch an die Datenbank. Davon dürften ja View und Controller nichts mitbekommen – sonst hätte das Pattern keinen Sinn.
Genau so sieht es aus... du ersetzt aber das Modell nicht. Wenn du das Modell, die interne Represenation der Daten änderst, hast du ein Problem. Das Modell wird aus Datenquellen gefüttert, es ist nicht die Datenquelle. Wenn dein Daten eine Text- oder XML-Datei, serialisierte Objekte, distributierte Datenbanken etc sind... ist das für die MVC Pattern egal. Du musst dann nur eine neue Schnittstelle schreiben, um die Daten aus den Datenquellen herauszuholen und in das Modell einfliessen zu lassen. Sonst würde man nach deiner Aussage ja für jedes Speichermedium ein eigenes Modell benötigen.


Zitat:
Wie ich im vorigen Post schon geschrieben habe: Wenn es eine rein lokale Anwendung wäre, dann wäre mir das klar. Ich frage mich nur, wie ich das überhaupt integrieren könnte. Das wäre nämlich das einzige Stück Logik überhaupt serverseitig, ist aber leider nötig; sonst könnte ja jeder das Skript einfach im Webbrowser aufrufen und das Guestbook flooden. Aber auch wenn ich jetzt die Captcha-Prüfung wegmache und bspw. eine Zeitbeschränkung serverseitig einführe, dann muss das Model ja Logik beinhalten, um das abzudecken. Andererseits ist das, was ich hier schreibe, an sich schon ein Widerspruch zu dem, dass das Model einfach durch andere Varianten (z.B. lokal) ersetzbar ist. Vielleicht wäre es also besser, dem Model einfach eine Methode mitzugeben, die zurückliefert, ob gerade ein Eintrag hinzugefügt werden kann. Diese Methode würde bei einem LocalModel zwar immer true zurückzugeben, aber erscheint mir halbwegs passend.
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...
Hier ein Auszug aus dem Buch:
  • Model: Stores the data and application logic for the interface
  • View :Renders the interface (usually to the screen)
  • Controller: Responds to user input by modifying the model
Ich habe das Model anders kennengelernt. Aber so richtig eindeutig liest sich mein Beispiel/Definition auch nicht.

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:
Vielleicht habe ich das wirklich verwechselt... Ich habe mir einfach gedacht, wenn ich zum Eintrag erstellen komplett andere Steuerelemente usw. habe, kann ich das Ganze gleich als zweite View auslegen. Aber stimmt, logischer ist es sicher anders. Ein Problem weniger
Ich würde es als ein View betrachten. Weil es nur ein Ausgabeformat ist.

Solche Patterns lassen schon Spiel für Interpretationen... ich orientiere mich sehr stark an der drei Schichten Architektur: GUI, Business Logic, Data Sources...
Omega Psi ist offline   Mit Zitat antworten
Alt 20-12-2006, 06:18   #7 (permalink)
DeRailed
 
Benutzerbild von klickverbot
 
Registriert seit: Sep 2006
Beiträge: 321
Zitat:
Zitat von Omega Psi Beitrag anzeigen
Genau so sieht es aus... du ersetzt aber das Modell nicht. Wenn du das Modell, die interne Represenation der Daten änderst, hast du ein Problem. Das Modell wird aus Datenquellen gefüttert, es ist nicht die Datenquelle. Wenn dein Daten eine Text- oder XML-Datei, serialisierte Objekte, distributierte Datenbanken etc sind... ist das für die MVC Pattern egal. Du musst dann nur eine neue Schnittstelle schreiben, um die Daten aus den Datenquellen herauszuholen und in das Modell einfliessen zu lassen. Sonst würde man nach deiner Aussage ja für jedes Speichermedium ein eigenes Modell benötigen.
Das war ziemlich missverständlich formuliert. Was ich meinte: Wenn ich ein neue Datenquelle habe, dann erstelle ich einfach eine neue Unterklasse von GuestbookModel (das praktisch eine abstrakte Klasse ist) und gebe eine Instanz meinem Controller und meiner View mit auf dem Weg (jaja, vielleicht bin ich ein bisschen zu viel von C++ beeinflusst), denen es egal ist, ob es ein XMLModel oder ein LocalModel oder ein OracleModel ist, hauptsache es leitet sich von GuestbookModel ab.
klickverbot ist offline   Mit Zitat antworten
Alt 20-12-2006, 07:59   #8 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
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:
  1. class GuestBookModell() {
  2.  
  3.     /** Properties and functions.
  4.           .
  5.           .
  6.           .
  7.           End properties and functions.
  8.       */
  9.  
  10.    /** Adding one entry obtained from the view */
  11.    function addEntry(viewmessages:Array) {
  12.        /** Adding the entry to the datastructures. */
  13.    }
  14.  
  15.    function addEntries(otherguestbookmodell:GuestbookModell):Void {
  16.        /** Add the other entries to this instance of the guestbookmodell. */
  17.    }
).

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:
  1. class DataSourcesConnector {
  2.  
  3.     var dbconnector:DBConnector;
  4.     var txtsource:TXTConnector;
  5.     var xmlsource:XMLConnector;
  6.     var myguestbookmodell:GuestBookModell;
  7.  
  8.     function DataSourcesConnector(_params:Array, _txturl:String, _xmlurl:String) {
  9.         if (_params != null) {
  10.             dbsource = new DBConnector(_params[]);
  11.         } else if (_txturl != null) {
  12.             txtsource = new TXTConnector(_txturl);
  13.         } else if (_xmlurl != null) {
  14.             xmlsource = XMLCOnnector(_xmlurl);
  15.         }
  16.     }
  17.    
  18.     function getGuestBookModell(type:Number): GuestBookModell {
  19.         if (type == 1) {
  20.             return this.getDBSource();
  21.         } else if (type == 2) {
  22.             return this.getTXTSource();
  23.         } else if (type == 3) {
  24.             return this.getXMLSource();
  25.         } else {
  26.             // No valid type specified,
  27.             // return an empty GuestBookModell
  28.             return new GuestBookModell();
  29.         }
  30.     }
  31.  
  32.     function getDBSource():GuestBookModell {
  33.         myguestbookmodell = dbsource.getData();
  34.         return myguestbookmodell;
  35.     }
  36.  
  37.     function getTXTSource():GuestBookModell {
  38.         myguestbookmodell = txtsource.getData();
  39.         return myguestbookmodell;
  40.     }
  41.  
  42.     function getXMLSource():GuestBookModell {
  43.         myguestbookmodell = xmlsource.getData();
  44.         return myguestbookmodell;
  45.     }
  46. }
  47.  
  48. /** Interface for single classes to implement. */
  49. Interface Connector {
  50.  
  51.     /** Retrieving data in a GuestBookModell. */
  52.     function getData():GuestBookModell;
  53. }
  54.  
  55. /** Getting data from the Database. */
  56. class DBConnector implements Connector {
  57.  
  58.     var myguestbookmodell:GuestBookModell;
  59.  
  60.     function DBConnector(_params:Array){
  61.         // 1. Connect to the database
  62.         // 2. Capture the data and make
  63.         //     a GuestBookModell out of it.
  64.     }
  65.  
  66.     function getData():GuestBookModell {
  67.         return myguestbookmodell;
  68.     }
  69. }
  70.  
  71. /** Getting data from a textfile. */
  72. class TXTConnector implements Connector {
  73.  
  74.     var myguestbookmodell:GuestBookModell;
  75.  
  76.     function TXTConnector(_params:Array){
  77.         // 1. Load the textfile.
  78.         // 2. Capture the data and make
  79.         //     a GuestBookModell out of it.
  80.     }
  81.  
  82.     function getData():GuestBookModell {
  83.         return myguestbookmodell;
  84.     }
  85. }
  86.  
  87. /** Getting data from a textfile. */
  88. class XMLConnector implements Connector {
  89.  
  90.     var myguestbookmodell:GuestBookModell;
  91.  
  92.     function XMLConnector(_url:String){
  93.         // 1. Load the XML
  94.         // 2. Capture the data and make
  95.         //     a GuestBookModell out of it.       
  96.     }
  97.  
  98.     function getData():GuestBookModell {
  99.         return myguestbookmodell;
  100.     }
  101. }
So würde ich es machen... das ist halt nur eine Skizze, um meine Backend-Communication zu skizzieren.

Geändert von Omega Psi (20-12-2006 um 08:37 Uhr)
Omega Psi ist offline   Mit Zitat antworten
Alt 20-12-2006, 13:51   #9 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
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
bokel ist offline   Mit Zitat antworten
Alt 20-12-2006, 21:45   #10 (permalink)
DeRailed
 
Benutzerbild von klickverbot
 
Registriert seit: Sep 2006
Beiträge: 321
Zitat:
Zitat von Bockel
Interessanter Thread.
Meinst du das ernst?

Zitat:
Zitat von Omega Psi Beitrag anzeigen
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.
Ich glaube, dass ich mit meinem Absatz gar nicht so viel komplizierter fahre. Ich kann zwar nicht zwei Quellen gleichzeitig nutzen, aber da würde das MVC-Pattern wohl ohnehin ein kombinierendes Model erfordern (sofern die Daten in der gleichen View und mit Hilfe des gleichen Controllers verarbeitet werden).

Hier habe ich das einmal skizzenhaft dargestellt (ja, ich weiß, es gibt kein abstract usw.)
ActionScript:
  1. /**
  2. * Controller.
  3. */
  4. class ItemSearchController {
  5.     public function getModel() :ItemSearchModel {
  6.         return m_model;
  7.     }
  8.     public function setModel( model :ItemSearchModel ) :Void {
  9.         m_model = model;
  10.         m_model.update();
  11.     }
  12.     private var m_model :ItemSearchModel;
  13. }
  14.  
  15. /**
  16. * Model.
  17. */
  18. abstract class ItemSearchModel {
  19.     public abstract function search( query :String );
  20.    
  21.     public function addView( view :ItemSearchView ) {
  22.         [...]
  23.     }
  24.     public function removeView( view :ItemSearchView ) {
  25.         [...]
  26.     }   
  27.     public function update() :Void {
  28.         [...]
  29.     }
  30. }
  31.  
  32. class EbaySearchModel extends ItemSearchModel {
  33.     public function search( query :String ) :Boolean {
  34.         [..]
  35.     }
  36. }
  37.  
  38. class AmazonSearchModel extends ItemSearchModel {
  39.     public function search( query :String ) :Boolean {
  40.         [..]
  41.     }
  42. }
  43.  
  44. /**
  45. * Application
  46. */
  47. class ItemSearchModel {
  48.     public function ItemSearch( container :MovieClip ) {
  49.         m_container = container;
  50.     }
  51.    
  52.     public function run() :Void {
  53.         var view :ItemSearchView = new ItemSearchView( m_container );
  54.         var controller :ItemSearchController = new ItemSearchController();
  55.         var ebayModel :ItemSearchModel = new EbaySearchModel();
  56.        
  57.         view.setController( controller );
  58.         controller.setView( view );
  59.         controller.setModel( ebayModel );
  60.         ebayModel.addView( view );
  61.        
  62.         ebayModel.update();
  63.        
  64.         // Wenn ich jetzt lieber amazon nutzen würde, müsste ich ja nur das machen:
  65.         ebayModel.removeView( view );
  66.         var amazonModel :ItemSearchModel = new AmazonSearchModel();
  67.        
  68.         controller.setModel( amazonModel );
  69.         amazonModel.addView( view );
  70.         amzoneModel.update();
  71.     }
  72.    
  73.     public static function main( container :MovieClip ) {
  74.         var instance :ItemSearch = new ItemSearch( container );
  75.         container.run();
  76.     }
  77.    
  78.     private var m_container :MovieClip;
  79. }


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)
klickverbot ist offline   Mit Zitat antworten
Alt 20-12-2006, 21:51   #11 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
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!
Omega Psi ist offline   Mit Zitat antworten
Alt 20-12-2006, 22:01   #12 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
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...
Omega Psi ist offline   Mit Zitat antworten
Alt 20-12-2006, 22:20   #13 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.147
Zitat:
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...)
Kannst du das nicht eine POST-Anfrage stellen und dir eine Erlaubnis von Server holen, die Nachricht zu speichern?

Zitat:
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.
Zitat:
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...
Und wieder denke ich, dass es konzeptionell nicht richtig sein kann. Wenn du eine neue View konzipierst, brauchst du auch einen neuen Controller... und eigentlich auch ein neues Modell.

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).
Omega Psi ist offline   Mit Zitat antworten
Alt 20-12-2006, 22:44   #14 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
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
bokel ist offline   Mit Zitat antworten
Alt 20-12-2006, 22:59   #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.
MaticPel ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 16:52 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele