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

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 11-03-2009, 20:13   #1 (permalink)
Neuer User
 
Registriert seit: Jun 2005
Beiträge: 96
Grundlegender Aufbau / UML

Hallo

Ich bin mal wieder am basteln und hatte eigentlich vor einem Jahr gedacht ich könnte meine eigene Flash - Website auf die schnelle bauen.
Habe davor nur Perlscripte geschrieben, also keine OOP.
Habe mir dann ein AS3 Buch gekauft und meine erste Website gebaut.

http://www.ingopolster.com
Für die erste ist es auch ganz gut geworden und ist in ein Paar Klassen organisiert.
Es gab aber einige Probleme bei der Programmierung und vor allem zum Schluss hin wurden die Wortkarounds schon etwas häufiger.

Jetzt sind wieder ein Paar Monate vergangen und ich möchte meine Website komplett neu designen.
Bevor ich mich ins Programmieren stürze, was bei meiner wenigen Übung meist lange dauert, wollte ich einige Probleme meiner alten Programmierung überdenken um nicht die gleichen Fehler nochmal zu machen.

Ich habe versucht das mal in einem ULM festzuhalten.

Ich habe von sowas nicht viel Ahnung also bitte nicht motzen.

Das Größte Problem ist das Menü. Es funktioniert aber ich frage in "Mymenue" den Eventlistener welcher button geklickt wurde und übergebe
den Namen des Buttons an den Contentcontroller der damit den jeweiligen Content lädt.
Code:
public function load_content(contentname:String):void {
			if (contentname == "People"){
				loaded_content = new Gallery("people", 20);
				add_hider();
			}
			if (contentname == "Still"){
				loaded_content = new Gallery("still", 9);
				add_hider();
			}
			if (contentname == "3-Dimensional"){
				loaded_content = new Gallery("3D", 2);
				add_hider();
			}
			if (contentname == "About"){
				loaded_content = new About();
				add_hider();				
			}
			if (contentname == "Imprint"){
				loaded_content = new Impressum();
				add_hider();				
			}
Das ist total schlecht, ich weis. Ich habe aber keine Ahnung wie ich sauber die Information, was passieren soll wenn der Button geklickt wurde, im Button selbst abspeichern kann.

Wäre toll wenn es einige Anregungen gäbe, auch zur grundlegenden Modellierung solcher Klassen für meinen Zweck.
Es soll nicht super toll werden aber über sauberere Schnittstellen wäre ich sehr dankbar.
Howan ist offline   Mit Zitat antworten
Alt 12-03-2009, 07:51   #2 (permalink)
Developer
 
Benutzerbild von malthoff
 
Registriert seit: Sep 2001
Ort: Stuttgart
Beiträge: 519
Hallo Howan.

Erstmal Props für das Video Blackout Gefällt mir sehr gut. Wielange hast
Du daran gesessen?

Zu deinem Aufbau: Der ist nicht schlecht. Und deine Idee, den Namen des Button an den Controller zu schicken, der dann entscheidet, was er lädt ist ebenfalls völlig ok. Damit hast Du eine funktionierende View Klasse (Menu), zu der Du immer einen neuen Controller schreiben könntest.

Natürlich ist es immer möglich alles perfekt nach Design Pattern zu lösen aber bei der größe des Projekts seh ich dazu fast keinen Anlass. Soll der Aufbau deiner neuen Site genauso aussehen?

Was aus deiner UML zeichnung, die sehr übersichtlich und damit gut ist, wird nicht klar, ob Du die Namen der Button per Events an den Controller schickst. Es sieht eher so aus, als würden sich beide direkt unterhalten. Aber selbst das finde ich, wie schon gesagt, bei der Größe nicht so tragisch. Zusätzlich könntest Du noch für jeden Content Typ einen eigenen Controller erstellen, um den einen großen Controller zu entlasten.

Für sehr gute Aufbautipps bzw. Erklärungen zu Design Pattern bitte hier weiterlesen: www.as3dp.com (aber hier im Forum weiterdiskutieren :-) )

Geändert von malthoff (12-03-2009 um 07:52 Uhr)
malthoff ist offline   Mit Zitat antworten
Alt 12-03-2009, 08:00   #3 (permalink)
no guts no glory
 
Benutzerbild von readme.txt
 
Registriert seit: May 2004
Ort: Nordhorn
Beiträge: 7.998
Sieht gut aus imho ... und den zu ladenden Content als String an eine Funktion zu übergeben die die Steuerung übernimmt halte ich auch für eine vernünftige Methode das zu machen ... jedenfalls mache ich das auch so:

PHP-Code:

  
  
private function switchContent(page:String):Void {
    var 
_scope:Main         this;    
    
    
// -> Die Main.switchContent()-Methode ist dafür zuständig den Seiteninhalt
    //    zu wechseln. Basierend auf dem übergebenen String wird eine Content-Instanz
    //    erstellt, aufgebaut und angezeigt.
    //    Der Content-Instanz wird ein MovieClip übergeben der die Inhalte enthalten soll
    //    und eine Höhe/Breite.
    //    Zusätzlich wird noch der onContent-Event gefeuert der z.B. dazu genutzt werden kann
    //    die erstellten Inhalte einzublenden.
    
    // -> Eine Debug-Nachricht ausgeben.
    
Bug._trace("Main.switchContent(): "+page);
    
    
// -> Einen _listener, den MovieClip der die Inhalte fassen soll und die Höhe/Breite des
    //    Inhaltes erstellen.
    
var _listener:Object   = new Object();
    var 
_content:MovieClip _scope._timeline.createEmptyMovieClip("content"+_scope._timeline.getNextHighestDepth(),_scope._timeline.getNextHighestDepth());
    var 
_h:Number          Math.round(Stage.height-_scope._offset-100)-(Math.round(Stage.height-_scope._offset-100)%10);
    var 
_w:Number          Math.round((_h/3)*4)-(Math.round((_h/3)*4)%10);
    
    
// -> Per switch entscheiden welcher Contenttyp geladen werden muss und eine
    //    neue Instanz dieser Contenttypen erstellen. 
    //    Außerdem den onContent-Event anmelden.
    
switch(page) {
      case 
"lobby":
      
_scope._curr = new Lobby(_content,_w,_h);
      
_scope._curr.addEventListener("onContent",_listener);
      break;
        
      case 
"deck":
      
_scope._curr = new Deck(_content,_w,_h);
      
_scope._curr.addEventListener("onContent",_listener);
      break;
        
      
/*case "achievements":
      _scope._curr = new Achievements(_content,_w,_h);
      _scope._curr.addEventListener("onContent",_listener);
      break;*/
        
      
default:
      
_scope._curr = new Lobby(_content,_w,_h);
      
_scope._curr.addEventListener("onContent",_listener);
      break;
    }
    
    
// -> Wenn der onContent-Event gefeuert wird ...
    
_listener.onContent = function():Void {
      
// -> ... den Event wieder löschen.
      
_scope._curr.removeEventListener("onContent",_listener);
    }
  } 
Die jeweiligen Contentklassen erben dabei von einer "BaseContent"-Klasse die den Grundlegenden aufbau enthält. Und die einzelnen Contentklassen übernehmen dann
das Befüllen mit Inhalten weil die Dinge die dargestellt werden sollen/müssen ja auf jeder Unterseite anders sein können.
__________________
Bitte keine Privaten Nachrichten mit Fragen, dazu ist das Forum selbst da. Danke.

'We live in an amazing, amazing world, and it's wasted on the crappiest generation of spoiled idiots.'

Geändert von readme.txt (12-03-2009 um 08:02 Uhr)
readme.txt ist offline   Mit Zitat antworten
Alt 12-03-2009, 08:15   #4 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Bremen
Beiträge: 13.345
Hier mal ein kleiner Versuch, der Verbesserung. Das Problem, dass du hast: es bestehen recht viele Abhängigkeiten. Schaue dir mal meine UML Diagramm an.

Meiner Meinung nach musst du den Controller nicht aus der MainView herausziehen, dafür ist das Projekt zu klein. Empfange einfach die Events der MenuButtons und zeige das an, was zu sehen sein soll. Das wäre so grob skizziert meine Idee.

@Ache:
Zitat:
Was aus deiner UML zeichnung, die sehr übersichtlich und damit gut ist, wird nicht klar, ob Du die Namen der Button per Events an den Controller schickst.
Dafür gibt es andere Diagramme.
Angehängte Grafiken
Dateityp: png Website.png (10,9 KB, 192x aufgerufen)

Geändert von Omega Psi (12-03-2009 um 08:16 Uhr)
Omega Psi ist offline   Mit Zitat antworten
Alt 12-03-2009, 16:24   #5 (permalink)
Neuer User
 
Registriert seit: Jun 2005
Beiträge: 96
Vielen Dank erstmal für die schnellen Antworten.
Ich muss zugeben das ich etwas überrascht bin. Ich hatte gedacht ihr zerreist den Entwurf in der Luft. Es bleiben aber Fragen.

Wenn ich mir den Entwurf von Omega Psi so ansehe verstehe ich das folgendermaßen.

Wenn ein Button geklickt wird, bubbelt der KlickEvent nach oben und wird auch erst in WebSite abgefangen.
Jetzt muss abgefragt werden ob überhaupt ein Button geklickt wurde oder ein anderes Element das vll Klickevents auslösen kann.

Das habe ich bis jetzt folgendermaßen gelöst.
Das sieht für mich aber nach einer Notlösung aus, da es ja eigentlich nicht sein kann, das ich im Nachhinein wieder herausfinden muss wasgeklickt wurde.
Wie kann ich das sauberer machen?

Code:
  1. private function mouseClickHandler(event:Event):void{
  2.             //trace(event.target.name);
  3.            
  4.             if (event.target is Mybutton){
  5.                 var content_to_load = event.target.name;
  6.                 contentobject.load_content(content_to_load);
  7.             }         
  8.             if (event.target is Singlepic){
  9.                 var _folder:String = event.target.get_folder();
  10.                 var _actuell_number:uint = event.target.get_actuell_number();
  11.                 var _total_amount:uint = event.target.get_total_amount();
  12.                 var bigpic:BigPic = new BigPic(_folder,_actuell_number,_total_amount);
  13.                 addChild(bigpic);
  14.             }         
  15.             if (event.target is BigPic){
  16.                 TweenLite.to(event.target, 0.5, {alpha:0, onComplete:remove_BigPic});
  17.             }         
  18.         }

Vielen Dank schonmal an euch!
Ist hier mit Abstand das beste und freundlichste Forum das ich kenne.

@Dr.Ache: Das video haben wir zu dritt als Studienarbeit in ca 4-5 Wochen realisiert.
Kann man bei uns Studenten nicht immer so genau sagen, da wir an vielen Sachen gleichzeitig arbeiten.

lg
Ingo

Geändert von Howan (12-03-2009 um 16:28 Uhr)
Howan ist offline   Mit Zitat antworten
Alt 13-03-2009, 08:28   #6 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Bremen
Beiträge: 13.345
Ich würde das so machen, dass ich in der Menu Klasse den MouseEvent.CLICK abfange und dann nach aussen hin einen eigenen Event dispatche, der die Information transportiert, die ich brauche um zu wissen, was ich anzeigen lassen will. Dieser Event wird in der Website Klasse verarbeitet und fertig.
Omega Psi ist offline   Mit Zitat antworten
Alt 15-03-2009, 19:03   #7 (permalink)
Neuer User
 
Registriert seit: Jun 2005
Beiträge: 96
Hi Omega

Sehe ich das richtig??
Mit deiner Idee erreiche ich, das die Klassen für das Menü klar vom Rest der Website getrennt sind und durch den selbst erstellten Event bekomme ich eine klar definierte Schnittstelle zur Klasse "Website".

Wie würde dieser EventDispatcher aussehen?
Ich werde da nicht schlau draus......
Code:
  1. package {
  2.    
  3.     import flash.display.Sprite;
  4.     import flash.events.Event;
  5.    
  6.     public class MyDispatcher extends Sprite {
  7.        
  8.         public function MyDispatcher() {
  9.             addEventListener("customEvent", handleEvent);
  10.             dispatchEvent(new Event("customEvent"));
  11.         }
  12.        
  13.         private function handleEvent(event:Event):void {
  14.             trace(event.type); // "customEvent"
  15.         }
  16.     }
  17. }

LG
Ingo
Howan ist offline   Mit Zitat antworten
Alt 15-03-2009, 19:33   #8 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Bremen
Beiträge: 13.345
Jede Sprite Instanz ist auch ein EventDispatcher. Du musst nur eigene Events dispatchen.
Omega Psi ist offline   Mit Zitat antworten
Alt 27-03-2009, 01:56   #9 (permalink)
thinkin aBout tha lib.
 
Benutzerbild von kaneda
 
Registriert seit: Nov 2001
Ort: Kölle
Beiträge: 1.379
*kopfkratz*

Hmm - also traditionellerweise löse ich das über ein dictionary. Beispiel:

Code:
var menu: Menu = new Menu();
menu.addButton( new MenuButton( "People", new Gallery("people"), webSite ) );
menu.addButton( new MenuButton( "Gallery", new Gallery("gallery"), webSite ) );
... usw.
dann kann ich einfach einen MenuButton basteln ala:

Code:
class MenuButton extends TextButton {
   private var _page: IPage;
   private var _webSite: Website;
   public function MenuButton( name: String, page: IPage, webSite: Website ) {
     super( name );
     _page = page;
     _webSite = webSite;
     addEventListener( MouseEvent.CLICK, onClick );
   }
   public function onCLick( event: Event ): void
   {
     _webSite.showPage( _page );
   }
}
Damit bekommt Website nur noch eine Dependency zu IPage (die von den anderen seiten implementiert wird). MenuButton delegiert an die Website... Vielleicht reicht es dir auch wenn alle Seiten vom Typ DisplayObject sind, wer weiss. Wenn man dazu noch ein bischen übertreiben will kann man das "_website.showPage" auch in einen Command umwandeln:

Code:
class ShowWebsite implements ICommand {
  private var _page: IPage;
  private var _website: Website;
  public function ShowWebsite( page: IPage, website: Website )
  {
     _page = page;
     _website = website;
  }

  public function execute(): void
  {
     _website.showPage( _page );
  }
}

new MenuButtuon( "Gallery", new ShowWebsite( new Gallery("gallery"), website ) );
das würde alles noch etwas mehr entkapseln und macht auch sinn wenn du von 10 verschiedenen stellen den selben befehl aufrufen möchtest ... aber ich glaub im konkreten fall ist das überflüssig
__________________
Back to community with http://leichtgewicht.at
kaneda 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 06:04 Uhr.

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


Copyright ©1999 – 2014 Marc Thiele