Flashhilfe.de - Flash Community

wie schaffe ich eine übersichtliche Programmstruktur? [Flash CS3]

 


AntwortenRegistrieren Seite1 2 3  

emotion#1
Benutzerbild von emotion
Beiträge: 191
Registriert: Jun 2008

08.12.2008, 16:44

Hallo Leute

Ist es eigentlich möglich mit Flash eine solche Programmstruktur anzuwenden?

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//*******************************************
//* Hauptprogramm
//*******************************************

getPhotoInfos();
while(DataFlag != true)
{
}
initPinWall();
while(initFlag != true)
{
}
initButtons();
..
..

//*******************************************
//* Funktionen
//*******************************************

function getPhotos():void
{
      //Fotosinfos aus Datenbank laden
      //DataFlag = true;
}

function initPinWall():void
{
      //Fotos von Server laden und anzeigen
      //initFlag = true;
}



oder meckert da der Player möglicherweise bei zu langen Wartezeiten auf die Flags?
Ich hatte immer so ein "Eventlistenergehüpfe" bei AS2 und jetzt bin ich auf AS3 umgestiegen und frage mich ob es nicht möglich ist, den Programmablauf strukturiert darzustellen!? oder wie kann man das anders lösen?

gruss
emotion
Werbung
Beiträge: 0
Registriert: Feb 2016


jill#2
Benutzerbild von jill
Beiträge: 604
Registriert: Jan 2007

09.12.2008, 08:45

indem du die struktur übersichtlicher machst. ;) Das "EventListener-gehüpfe" gibt's auch in AS3, z.B. wenn du in einer Subklasse die Daten aus einer XML oder Datenbank fertiggeladen und gespeichert hast und dem Hauptprogramm dies mitteilen willst.

Also pseudo AS2 sowas in der Art:

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
class MainApp
{
   var _dataProvider:Object;
   function MainApp()
   {
      // dies und das
      _dataProvider = new DataProvider();
      _dataProvider.addListener(this);
   }
   function loadDP()
   {
      _dataProvider.loadData();
   }
   function onDataLoaded(event)
   {
      // dies und das
      var photos = _dataProvider.getPhotos();
      var pinwall = _dataProvider.initPinWall();
      while(!photos.end)
      {
         // dies und das mit photos
      }
      // dies und das mit pinwall
   }
}

class DataProvider
{
   var _data:Object;
   function DataProvider()
   {
      ASEventBroadCaster.initialize(this);
   }
   function loadData()
   {
      var url = "data.xml";
      var xmlLoader = new XML();
      xmlLoader.ignoreWhite = true;
      xmlLoader.onLoad = Proxy.setFunction(xmlLoaded, loader);
      xmlLoader.load(url);
   }
   function xmlLoaded(ldr)
   {
      _data = ldr.xml2Obj();
      ASBroadCastEvent(new Event("onDataLoaded", {target:this, loder:ldr}));
   }
   function getPhotos()
   {
      // dies und das aus _data
      return photos;
   }
   function initPinWall()
   {
      // dies und das aus _data
      return pinWall;
   }
}


mfg
jill
emotion#3
Benutzerbild von emotion
Beiträge: 191
Registriert: Jun 2008

Themenautor/in

09.12.2008, 12:18

danke für das Beispiel!
also da gibts wirklich keine Lösung, damit man den Programmverlauf schön vom oben nach unten betrachten kann, sobald EventListener zum Einsatz kommen ists vorbei, richtig? wieso geht eigentlich das Schleifenprinzip mit den Flags nicht? hatte das früher bei uController-Programmierungen so gelöst..

wie siehts eigentlich bei deinem Beispiel aus wenn du nun in der Funktion
"function onDataLoaded(event)" einen weiteren EventListener benötigst.. wo kommt der handler hin? ausserhalb der funktion oder innerhalb?
Geändert von emotion am 09.12.08 um 12:31 Uhr
omega psi#4
Benutzerbild von omega psi
Beiträge: 791
Registriert: Apr 2004

09.12.2008, 12:35

Das Problem, vor dem du stehst: Programme werden nicht immer noch von oben nach unten abgearbeitet. Deswegen bieten sich Klassen an, um eine vernünftige Struktur zu modellieren.

Und Listener niemals in einer Funktion oder anonym deklarieren.
Architectures - Refactoring - Prototyping - Coding - Training
Werbung
Beiträge: 0
Registriert: Feb 2016


emotion#5
Benutzerbild von emotion
Beiträge: 191
Registriert: Jun 2008

Themenautor/in

09.12.2008, 12:44

ich frag mich gerade ob ich dich richtig verstanden habe.. soll das heissen dass die Objekte die ein Listener erhalten global deklariert werden sollen?
Geändert von emotion am 09.12.08 um 12:49 Uhr
omega psi#6
Benutzerbild von omega psi
Beiträge: 791
Registriert: Apr 2004

09.12.2008, 12:50

NEIN!!!

Auf keinen Fall. Vorher die Struktur konzipieren - dann programmieren. Die Listener dürfen und sollen nur dort sein, wo sie benötigt werden - genauso wie die Referenzen zu den Objekten.

Global ist böse!!!
Architectures - Refactoring - Prototyping - Coding - Training
emotion#7
Benutzerbild von emotion
Beiträge: 191
Registriert: Jun 2008

Themenautor/in

09.12.2008, 12:55

kannst du mir da villeicht ein kleines Beispiel demonstrieren?
jill#8
Benutzerbild von jill
Beiträge: 604
Registriert: Jan 2007

09.12.2008, 13:01

wenn es sich ganz einfach aus 3 Befehlen zusammensetzt dann ist es übersichtlich und man kann es der reihe nach betrachten, meistens ist das aber nicht der Fall, wegen viel Code, OOP, usw..., klar geht das schleifenprinzip mit den flags. Mit EventListeners sendet man einfach ein Ereignis an den "Empfänger", z.B. bei RollOver oder Rollout auf einem Button soll ein Photo skaliert werden, dann sendest du einfach an die Photo-Klasse ein Ereignis von der Button-Klasse aus, hat jetzt nichts mit irgendeinem Programmverlauf von oben nach unten zu tun.

Dann bekommt die MainApp auch einen EventListener in der Konstruktor-Funktion z.B., so wie die DataProvider und dann sendest du aus der Funktion onDataLoaded einfach das Argument event weiter, praktisch ASBroadCastEvent(event) an das/die Empfänger-Objekt/Klasse. So als wäre MainApp die DataProvider-Klasse.

mfg
jill
omega psi#9
Benutzerbild von omega psi
Beiträge: 791
Registriert: Apr 2004

09.12.2008, 13:03

Der Beispiel für die Struktur einer Komponente: Link
Architectures - Refactoring - Prototyping - Coding - Training
emotion#10
Benutzerbild von emotion
Beiträge: 191
Registriert: Jun 2008

Themenautor/in

09.12.2008, 13:27

danke für die Antworten!

@omega psi:
ich arbeite gerade dein Beispiel durch.. kannst du mir erklären wieso in den Konstruktoren der Befehl super() verwendet wird? werde in der Hilfe irgenwie nicht schlau daraus.. da dein super parameterlos ist...
omega psi#11
Benutzerbild von omega psi
Beiträge: 791
Registriert: Apr 2004

09.12.2008, 13:31

super wurde durch die IDE hinzugefügt. Meherwert geht gegen +/- null, da der Aufruf implizit sonst durch den Compiler hinzugefügt wird. Ich hab's aber lieber explizit.
Architectures - Refactoring - Prototyping - Coding - Training
emotion#12
Benutzerbild von emotion
Beiträge: 191
Registriert: Jun 2008

Themenautor/in

09.12.2008, 13:38

ok und das this kann man eigentlich auch weglassen oder nicht?
Geändert von emotion am 09.12.08 um 13:38 Uhr
omega psi#13
Benutzerbild von omega psi
Beiträge: 791
Registriert: Apr 2004

09.12.2008, 13:41

Ja, das kann man
Architectures - Refactoring - Prototyping - Coding - Training
emotion#14
Benutzerbild von emotion
Beiträge: 191
Registriert: Jun 2008

Themenautor/in

09.12.2008, 14:18

dein beispiel ist super! hab schon länger nach sowas gesucht..
nimmst du eigentlich generell protectet statt private bei den Funktionen in den Klassen damit in Zukunft falls nötig geerbt werden kann? kannst du vielleicht die Datei noch hier hochladen? hab leider kein Account im anderen Forum..
du hast nicht per Zufall noch nen Link zu ner Projekt Skizze? Flussdiagramme oder so?
omega psi#15
Benutzerbild von omega psi
Beiträge: 791
Registriert: Apr 2004

09.12.2008, 18:28

Projektskizzen etc hab ich nicht - für die Öffentlichkeit...

private und protected unterscheide ich je nach Anwendungsfall, wie auch internal....
Architectures - Refactoring - Prototyping - Coding - Training
emotion#16
Benutzerbild von emotion
Beiträge: 191
Registriert: Jun 2008

Themenautor/in

09.12.2008, 19:20

ich dachte immer klassen schreibt man um sie später wieder zu verwenden.. sie werden also auch dazu verwendet um eine übersichtliche Struktur zu schaffen korrekt?

macht es Sinn sowas in eine Klasse zu verpacken und bei geladenen Daten ein Event dispatchen und auf diese Ereignis ein Listener im Hauptprogramm adden?

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
function getPhotosFromDB():void
{

   var photoVars:URLVariables = new URLVariables();
   var photoRequest:URLRequest = new URLRequest();
   var photoLoader:URLLoader = new URLLoader();
   photoLoader.dataFormat = URLLoaderDataFormat.VARIABLES;
   photoRequest.url = "php/getPhotos.php?"+new Date().getTime();
   photoRequest.data = photoVars;
   photoRequest.method = URLRequestMethod.POST;
   photoLoader.load(photoRequest);
   photoLoader.addEventListener(IOErrorEvent.IO_ERROR, connectionError);
   photoLoader.addEventListener(Event.COMPLETE, photoDataLoaded);
}

function connectionError(evt:IOErrorEvent):void
{
   trace("Verbindung mit der Datenbank fehlgeschlagen");
}

function photoDataLoaded(evt:Event):void
{
   if(evt.target.data.readstatus != "ok")
   {
      trace("Fehler beim Laden der Fotoinformationen");
   }
   else
   {
      for(var i:uint = 0; evt.target.data["photoTime"+i]; i++)
      {
         photoInfos_array[i] =    {
                              photoTime: evt.target.data["photoTime"+i],
                              photoDate: evt.target.data["photoTime"+i].slice(0,10),
                              photoPath: evt.target.data["photoPath"+i],
                              photoCategory: evt.target.data["photoCategory"+i],
                              photoComment: evt.target.data["photoComment"+i]
                           };
      }
      
      initPhotoWall();
   }
}

AntwortenRegistrieren Seite1 2 3  

Schnellantwort

Du musst registriert sein, um diese Funktion nutzen zu können.

 
Ähnliche Beiträge zum Thema
Partner Webseiten: art-and-law.de  Mediengestalter.info   php-resource.de   phpforum.de   phpwelt.de   Pixelio.de   Scubacube.de  
Haftungsausschluss   Datenschutzerklärung   Hier Werben   Impressum
© 1999-2020 Sebastian Wichmann - Flashhilfe.de