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

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 02-03-2006, 08:13   #1 (permalink)
... loves Japan!
 
Benutzerbild von compuboy1010
 
Registriert seit: Apr 2005
Ort: D'dorf; DE
Beiträge: 715
Model View Controller Architektur

Hallo Board,

kennt sich jemand sehr gut mit der Model View Controller Architektur aus?
Ich bräuchte Hilfe beim Architekturdesign.
compuboy1010 ist offline   Mit Zitat antworten
Alt 02-03-2006, 11:20   #2 (permalink)
dreizeiler
 
Benutzerbild von mojave
 
Registriert seit: Sep 2004
Ort: Berlin
Beiträge: 1.411
ich beschäftige mich ebenfalls grade damit und wäre froh wenn jemand ein minimalbeispiel zeigen könnte. am besten mit hilfe der EventDispatcher-klasse von MM

Geändert von mojave (02-03-2006 um 11:26 Uhr)
mojave ist offline   Mit Zitat antworten
Alt 02-03-2006, 11:48   #3 (permalink)
... loves Japan!
 
Benutzerbild von compuboy1010
 
Registriert seit: Apr 2005
Ort: D'dorf; DE
Beiträge: 715
Also ein Minimalbeispiel hast du hier:

http://www.macromedia.com/devnet/fla...ontroller.html

Ich suche nach einer MVC Beispielarchitektur für eine Webseite mit mehreren Sektionen und einem Haupmenu. Kann mir solche eine Architektur einfach nicht vorstellen.

In dem Beispiel oben ist ja alles auf einem einzigen Stage. Wie ist es aber wenn der Benutzer auf einen Menüpunkt klickt und zu einer anderen Sektion der Seite springt? Braucht man dann für jede Sektion einen View und für alle sichtbaren Objekte dieser Sektion wieder einen View?

Geändert von compuboy1010 (02-03-2006 um 11:53 Uhr)
compuboy1010 ist offline   Mit Zitat antworten
Alt 02-03-2006, 14:22   #4 (permalink)
Flashaholic
 
Benutzerbild von atothek
 
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 1.459
Fang doch erstmal klein an dazu reichen ja erstmal 4 klassen

Flapp

Model
View
Controller

Flapp ist die Applikations klasse, in den anderen klassen erstellen wir zunächst einmal eine ganz simple implementierung. Dann gehen wir einen schritt weiter
hier zunächst einmal die einfache basis

mehr folgt später

mfg
alex
Angehängte Dateien
Dateityp: zip mvc.zip (7,1 KB, 130x aufgerufen)
__________________
TVNEXT Solutions
atothek ist offline   Mit Zitat antworten
Alt 02-03-2006, 14:45   #5 (permalink)
dreizeiler
 
Benutzerbild von mojave
 
Registriert seit: Sep 2004
Ort: Berlin
Beiträge: 1.411
vielen dank für so ein beispiel.

jedoch mal abgesehen davon, dass ich nix sehe wenn ich's kompilliere verstehe ich nicht warum du dem model eine referenz auf den controller übergibtst. ich dachte das es ein wesentlicher bestandteil von mvc ist, dass das model weder v noch c kennt, und events sendet wenn was passiert, die der controller verarbeitet.
mojave ist offline   Mit Zitat antworten
Alt 02-03-2006, 15:22   #6 (permalink)
Flashaholic
 
Benutzerbild von atothek
 
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 1.459
@mojave du mußt beim kompilieren vorher noch deinen classpath in flash erweitern

Menü->Bearbeiten->Voreinstellungen->ActionScript
und dann unten unter "ActionScript 2.0 Einstellung" einen neuen eintrag mit "./src" eintragen( ohne anführzeichen )

in sachen Model <-> Controller wäre es mir neu das das model nix vom controller wissen darf, wenn man mit EventDispatching arbeitet ist das nicht zwingend notwendig das stimmt, ich finde es aber zu verwirrend in einem einfachen Beispiel eine komplexe Event Struktur zu integrieren, und deshalb weise ich dem model eine referenz auf den controller zu

mfg
alex
__________________
TVNEXT Solutions
atothek ist offline   Mit Zitat antworten
Alt 02-03-2006, 15:56   #7 (permalink)
dreizeiler
 
Benutzerbild von mojave
 
Registriert seit: Sep 2004
Ort: Berlin
Beiträge: 1.411
ich habe mal eine frage zu einem echt simplen beispiel:

ein button der den status on/off bewirkt.


View: zeichnet den Button + Textfeld

Model: speichert den status.

Controller: ändert den status.

--------------------------------------------

Model: sendet über EventDispatcher einen event "onStatusChange"
PHP-Code:
public function changeStatus(){
    
dispatchEvent({type:"onChangeState",target:this});
}

public function 
getStatus():Boolean{
     return 
status;
}
public function 
setStatus(value):Boolean{
     
status value;

Controller: ist bei Model registriert und verarbeitet event:
PHP-Code:
function onChangeStatus(){
    
model.setStatus(!model.getStatus()); 
    
// hier view.update() ????  

View : bekommt update befehl
PHP-Code:
function update(){
     
textfeld.text model.getStatus();


1. frage: ist das soweit richtig verstanden?

2. frage: wie allerdings ist das mit der View-Klasse, die den Button und ein Textfeld zum anzeigen des status bereitstellt.
wie behandel ich hier ereignisse? gehts es den weg:
PHP-Code:
button.onPress = function(){
    
model.changeStatus();
}
//Model dispatcht "onChangeStatus"
//Controller fängt Event auf und behandelt.
//Controller sendet update ans View 
mojave ist offline   Mit Zitat antworten
Alt 02-03-2006, 16:16   #8 (permalink)
Neuer User
 
Registriert seit: Jan 2005
Ort: In the arena
Beiträge: 165
@atothek: auweia, da ist doch einiges verquer in deiner interpretation von mvc
z.bsp. 'In MVC, The controller is NOT a Mediator between the view and the model.'.

@mojave:
1. frage: ist das soweit richtig verstanden?

fast:
- das model verwaltet den status
- ein view kennt das model, seinen controller und registriert sich als listener beim model
- ein zum view gehöriger controller kennt seinen view und das model.

2. frage: wie allerdings ist das mit der View-Klasse, die den Button und ein Textfeld zum anzeigen des status bereitstellt.
wie behandel ich hier ereignisse?

der button im view wird geklickt.
der controller fängt dieses ab und ändert den status im model.
das model dispatched, das sich der status geändert hat.
die textanzeige des views verändert sich dementsprechend.
und wieder von vorne ...

hoffe'shilft
-sh
__________________
+++
Even a stopped clock gives the right time twice a day
subHero ist offline   Mit Zitat antworten
Alt 02-03-2006, 16:35   #9 (permalink)
Flashaholic
 
Benutzerbild von atothek
 
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 1.459
also zum einen würde ich das MVC nicht bei "Componenten" ähnlichen gebilden anwenden, das wäre wie mit kanonen auf spatzen schießen. Und dann ist deine logik nicht sinnvoll. du feuerst das onChange event ohne das was geändert wird ??? das muß genau anderes sein also das model ändert sich und danch feuert es das onChange event, der controller selber bekommt dann nur darüber bescheid und kann die view dann anpassen

mfg
alex

EDIT

@subHero Das sehe ich zb. ganz anders, der name sagt es doch schon aus, er kontrolliert also ist er der entscheidungsträger. und kontrolliert die view und das model. Sicherlich ist das eher das MVP prinzip

und wenn du dir deinen beitrag durchliest beschreibst du ja genau das verhlaten aus meinen beispiel

Zitat:
der button im view wird geklickt.
der controller fängt dieses ab und ändert den status im model.
das model dispatched, das sich der status geändert hat.
die textanzeige des views verändert sich dementsprechend.
und wieder von vorne ...
__________________
TVNEXT Solutions

Geändert von atothek (02-03-2006 um 16:49 Uhr)
atothek ist offline   Mit Zitat antworten
Alt 02-03-2006, 19:41   #10 (permalink)
Neuer User
 
Registriert seit: Jan 2005
Ort: In the arena
Beiträge: 165
Zitat:
Zitat von atothek
@subHero Das sehe ich zb. ganz anders, der name sagt es doch schon aus, er kontrolliert also ist er der entscheidungsträger. und kontrolliert die view und das model. Sicherlich ist das eher das MVP prinzip
umgeschrieben für GUI-MVC wäre das:
Das sehe ich zb. ganz anders, der name sagt es doch schon aus, er kontrolliert den userinput eines views, also ist er der entscheidungsträger was darauf zu erfolgen hat. er kontrolliert den input des views und abhängig von diesem ändert er das model oder den view direkt. Sicherlich ist das eher das MVC prinzip
Zitat:
und wenn du dir deinen beitrag durchliest beschreibst du ja genau das verhlaten aus meinen beispiel
eben, genau nicht (obwohl natürlich jedem die freiheit zur eigeninterpretation zugestanden ist). ist doch eigentlich schon zu genüge durchgekaut worden und mr. moock hat doch der welt sehr schöne, relevante schaubilder hinterlassen:





natürlich sind standalone-controller gängig (v.a. in tier-übergreifendem MVC, a la DB (Model), Browser (View) und DB-Access/Abstraction (Controller) ).
aber im GUI-MVC sollte man meiner meinung nach nicht die flexibilität, welches einem die model-unabhängigen view-controller-paare liefern (v.a. in puncto wiederverwendbarkeit), aufgeben.

mal ne gegenfrage:
wie würdest du denn weitere views, bzw. controller in deinem schema unter einem model integrieren (z.bsp. navigation *und* sektion)?
kann ja auch sein das ich aufm schlauch stehe...

cheers
-sh
__________________
+++
Even a stopped clock gives the right time twice a day
subHero ist offline   Mit Zitat antworten
Alt 02-03-2006, 21:05   #11 (permalink)
Flashaholic
 
Benutzerbild von atothek
 
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 1.459
also ich finde nicht das MVC ein derartiges Dogma ist, mir gefällt es zb. gar nicht das das model irgendwas von der view weiß, das model braucht die view gar nicht kennen, ich laß mal event basierte implemntierung dabei außen vor. Für mich ist halt der controller der dreh und angelpunkt oder ich sag mal lieber Presenter

Ich persönlich finde das Beispiel von Moock ehrlich gesagt auch nicht toll.
Ich finde es viel zu rückständig im vergleich zu dem MVP Pattern von Martin Fowler, der Ansatz ist wesentlicher interesanter und unabhängiger.

ich glaube das ist dabei die wesentlichste aussage

Zitat:
ist doch eigentlich schon zu genüge durchgekaut worden


richtige Projectimplemetierung sehen ehe ganz anders aus, da kommt man um EventBasierte umsetzungen sowie Managed Screens gar nicht drum rum.

hier ist nochmal nen version mit 2 views, in 20 min umgesetzt, wobei das nun kein ernst zu nehmendes Beispiel ist.

mfg
alex
Angehängte Dateien
Dateityp: zip mvc.zip (8,1 KB, 116x aufgerufen)
__________________
TVNEXT Solutions

Geändert von atothek (02-03-2006 um 21:15 Uhr)
atothek ist offline   Mit Zitat antworten
Alt 03-03-2006, 15:59   #12 (permalink)
Neuer User
 
Benutzerbild von the binary
 
Registriert seit: Jul 2001
Ort: Berlin | Friedrichshain
Beiträge: 3.561
sehr schickes beispiel.
__________________
8bm | join ff@BOINC
formpackage.org | audiohunter.de | problematica.de | 8ball-media.de/blog | taikonauten.cn
the binary ist offline   Mit Zitat antworten
Alt 04-03-2006, 07:45   #13 (permalink)
Nagelneuer User
 
Benutzerbild von hazy fantazy
 
Registriert seit: Dec 2005
Beiträge: 924
Hier ist noch ein anderes Beispiel, das eher der klassischen Auffassung von MVC entspricht. Zwei Textfelder, die voneinander abhängen. Im oberen steht eine Zahl von 0 bis 200 und im unteren die entsprechende Prozentzahl.

ActionScript:
  1. class MVCDemo {
  2.    
  3.     private static var instance:MVCDemo;
  4.    
  5.     public static function main( canvas:MovieClip){
  6.         instance = new MVCDemo( canvas);
  7.     }
  8.    
  9.    
  10.     private var canvas:MovieClip;
  11.     private var controller:Controller;
  12.     private var model:Model;
  13.     private var view:View;
  14.    
  15.     private function MVCDemo( canvas:MovieClip){
  16.         this.canvas = canvas;
  17.         setup();
  18.     }
  19.    
  20.     private function setup(){
  21.         controller = new Controller();
  22.         model = new Model();
  23.         view = new View(canvas);
  24.         //
  25.         controller.view = view;
  26.         controller.model = model;
  27.         view.controller = controller;
  28.         model.addEventListener( 'update', view);
  29.         //
  30.         run();
  31.     }
  32.    
  33.     private function run(){
  34.         controller.run();
  35.     }
  36.    
  37. }
  38.  
  39.  
  40. import mx.events.EventDispatcher;
  41.  
  42. class Model {
  43.    
  44.     public function Model(){
  45.         EventDispatcher.initialize( this);
  46.     }
  47.    
  48.     public function addEventListener( type:String, listener:Object):Void{}
  49.     private function dispatchEvent( evt:Object){}
  50.    
  51.     public var minValue:Number = 0;
  52.     public var maxValue:Number = 200;
  53.     public var value:Number = 0;
  54.     public var percent:Number = 0;
  55.    
  56.     public function update(){
  57.         dispatchEvent({type:"update"});
  58.     }
  59.    
  60.     public function setValue( v:Number):Void{
  61.         if( isNaN( v)) return;
  62.         if( v < minValue) v = minValue;
  63.         if( v > maxValue) v = maxValue;
  64.         value = v;
  65.         percent = (v - minValue) / (maxValue - minValue) * 100;
  66.         update();
  67.     }
  68.    
  69.     public function setPercent( v:Number):Void{
  70.         if( isNaN( v)) return;
  71.         if( v < 0) v = 0;
  72.         if( v > 100) v = 100;
  73.         percent = v;
  74.         value = percent / 100 * (maxValue - minValue) + minValue;
  75.         update();
  76.     }
  77. }
  78.  
  79. class View {
  80.    
  81.     public var controller:Controller;
  82.    
  83.    
  84.     private var tfValue:TextField;
  85.     private var tfPercent:TextField;
  86.    
  87.     public function View( canvas:MovieClip){
  88.         createUI( canvas);
  89.     }
  90.    
  91.     private function createUI( canvas:MovieClip){
  92.         canvas.createTextField("tfValue", 1, 0, 0, 100, 20);
  93.         tfValue = canvas["tfValue"];
  94.         tfValue.border = true;
  95.         tfValue.type = "input";
  96.         //
  97.         canvas.createTextField("tfPercent", 2, 0, 25, 100, 20);
  98.         tfPercent = canvas["tfPercent"];
  99.         tfPercent.border = true;
  100.         tfPercent.type = "input";
  101.         //
  102.         initKeyListener();
  103.     }
  104.    
  105.     private function update( evt:Object):Void{
  106.         tfValue.text = evt.target.value;
  107.         tfPercent.text = evt.target.percent + "%";
  108.     }
  109.    
  110.     private function initKeyListener(){
  111.         Key.addListener( this);
  112.     }
  113.    
  114.     private var enterPressed:Boolean = false;
  115.    
  116.     private function onKeyDown():Void{
  117.         if( enterPressed) return;
  118.         if( Key.getCode() != Key.ENTER) return;
  119.         enterPressed = true;
  120.         if( Selection.getFocus() == targetPath( tfValue)){
  121.             controller.setValue( tfValue.text);
  122.         } else if( Selection.getFocus() == targetPath( tfPercent)){
  123.             controller.setPercent( tfPercent.text);
  124.         }
  125.     }
  126.    
  127.     private function onKeyUp():Void{
  128.         enterPressed = false;
  129.     }
  130.    
  131.     private function onUnload(){
  132.         Key.removeListener( this);
  133.     }
  134. }
  135.  
  136.  
  137. class Controller {
  138.    
  139.     public var view:View;
  140.     public var model:Model;
  141.    
  142.     public function run(){
  143.         model.setValue( 150);
  144.     }
  145.    
  146.     public function setValue( v:String){
  147.         model.setValue( parseFloat(v));
  148.     }
  149.    
  150.     public function setPercent( v:String){
  151.         model.setPercent( parseFloat(v));
  152.     }
  153.    
  154. }

Was ich dabei ein bißchen störend finde, ist das sich setValue und setPercent durch alle drei Klassen zieht. Jedes weitere Eingabefeld führt also immer zu drei weiteren Routinen. Wenn ich ein Formular mit 30 Feldern habe, kann das schnell unübersichtlich werden.

mfg. h
Angehängte Dateien
Dateityp: zip mvcdemo_1.zip (8,6 KB, 37x aufgerufen)
__________________
The fact that you've got "Replica" written on the side of your gun and the fact that I've got "Desert Eagle written on the side of mine ... :D

Geändert von hazy fantazy (04-03-2006 um 07:56 Uhr)
hazy fantazy ist offline   Mit Zitat antworten
Alt 05-03-2006, 08:39   #14 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
Aber diese Beispiele sind ja alle vergleichsweise primitiv. Was compuboy1010 wollte ist schon ein bißchen komplexer. MVC ist ja nur ein Aspekt bei so einer kompletten Seite, damit werden halt die Views an das Model angebunden.

Zitat:
In dem Beispiel oben ist ja alles auf einem einzigen Stage. Wie ist es aber wenn der Benutzer auf einen Menüpunkt klickt und zu einer anderen Sektion der Seite springt? Braucht man dann für jede Sektion einen View und für alle sichtbaren Objekte dieser Sektion wieder einen View?
Genau, Views brauchst du jede Menge. Du könntest dir auch mal ARP und Caingorm anschauen. Das sind Frameworks für komplette Sites.
mfg. r.

Geändert von bokel (05-03-2006 um 08:46 Uhr)
bokel ist offline   Mit Zitat antworten
Alt 06-03-2006, 09:44   #15 (permalink)
... loves Japan!
 
Benutzerbild von compuboy1010
 
Registriert seit: Apr 2005
Ort: D'dorf; DE
Beiträge: 715
Wo bekommt man das?

Caingorm?
compuboy1010 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 15:34 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele