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

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 26-04-2011, 22:02   #1 (permalink)
JoH
Neuer User
 
Registriert seit: Dec 2005
Beiträge: 99
AS3 Functional

Mich würde mal interessieren wieviel Gebrauch AS3-Entwickler derzeit von der funktionalen Seite der Sprache machen.

Immerhin sind Funktionen in AS3 First-class objects und auch Konstrukte wie closures sind ohne weiteres machbar:
Code:
var i : int = 0
var myFunc : Function = function() : void {
    trace(i);
}
myFunc(); // 0
i += 1;
myFunc(); // 1
__________________
http://blog.johannes-hodde.com
JoH ist offline   Mit Zitat antworten
Alt 27-04-2011, 06:50   #2 (permalink)
Developer
 
Benutzerbild von malthoff
 
Registriert seit: Sep 2001
Ort: Stuttgart
Beiträge: 519
Habe ich noch nie benutzt in AS3. Aber ich gebe Dir Recht, dass es bestimmt Anwendungsfälle gibt, wo Closures eleganten Code schreiben könnten. Eventuell in Kombination mit Chaining - Jquery like.
malthoff ist offline   Mit Zitat antworten
Alt 27-04-2011, 08:22   #3 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Bremen
Beiträge: 13.358
Closures sind ein Feature der Sprache, um Funktionen als first level member nutzen zu können. Ihr meint denke ich die Funktionreferenzen.

Ich nutze es nur gelegentlich, beispielsweise bei komplexen Filteroperationen.
Omega Psi ist offline   Mit Zitat antworten
Alt 27-04-2011, 12:16   #4 (permalink)
Little Big Freak
 
Benutzerbild von Maciej
 
Registriert seit: Apr 2003
Beiträge: 305
Ich hab es noch nie benutzt und lern gerne immer dazu, aber im Moment versteh ich nicht bzw. fällt mir auf Anhieb kein Fall ein indem ich eine Referenz auf eine Function bräuchte.

Kann mir das jemand erklären oder ein bsp. geben wo sowas sinn machen würde?

Ich sehe jetzt in dem oberen bsp. keinen vorteilhaften Nutzen zu der Version:
PHP-Code:
var int 0
function myFunc() : void {
    
trace(i);
}
myFunc(); // 0
+= 1;
myFunc(); // 1 
Danke
Maciej ist offline   Mit Zitat antworten
Alt 27-04-2011, 12:54   #5 (permalink)
undefined
 
Benutzerbild von mildesign
 
Registriert seit: Jul 2001
Ort: Stuttgart
Beiträge: 1.859
wird in Flex für Filterung und Sortierung verwendet

mx.collections.ListCollectionView - ActionScript 3.0 Referenzhandbuch für die Adobe Flash-Plattform
PHP-Code:
var filter1= function(item):Boolean
{
return 
item.foo;
}

var 
filter2 = function(item):Boolean
{
return 
item.bar;
}

collection.filterFunction=filter1
__________________
mfg Frank
mildesign ist offline   Mit Zitat antworten
Alt 27-04-2011, 12:59   #6 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 7.306
Ein anderes Anwendungsgebiet wäre die Übergabe von Callback-Funktionen (z.B. bei Tweening Engines). Wobei dieses Vorgehen ja mehr und mehr vom Event-System verdrängt wird...
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!
Martin Kraft ist offline   Mit Zitat antworten
Alt 27-04-2011, 13:55   #7 (permalink)
Little Big Freak
 
Benutzerbild von Maciej
 
Registriert seit: Apr 2003
Beiträge: 305
K danke euch, in Flex arbeite ich mich gerade ein weswegen ist da jetzt noch nicht kannte mit dem Filter.

Callback-Funktionen kenne ich habe sie aber nie angewendet, hab wie Martin schon erwähnt immer nen Event genutzt, aber da macht ne Funktionsreferenz natürlich sinn.

Danke
Maciej ist offline   Mit Zitat antworten
Alt 27-04-2011, 14:13   #8 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Bremen
Beiträge: 13.358
Jeder Eventhandler ist eine Callback Funktion.
Omega Psi ist offline   Mit Zitat antworten
Alt 29-04-2011, 01:28   #9 (permalink)
JoH
Neuer User
 
Registriert seit: Dec 2005
Beiträge: 99
Habe jetzt mal ein wenig mit closures in as3 experimentiert.
Mit dem Ziel ein gutes Beispiel für closures anhand einer Alternative für ein switch case Konstrukt in as3 zu liefern bin ich vorerst bei folgendem gelandet:

Code:
package closuretest {
  public function match(object : *) : Function {
    return function(pattern : Function, resultHandler : Function) : Function {
      if(pattern(object)) {
        resultHandler(object);
        var f : Function = function(f1 : Function, f2 : Function) : Function {
	  return f;
	};
        return f;
      } else {
        return match(object);
      }
    };
  }
}
match ist eine lose Funktion die in einem eigenen package liegt.
match selbst erwartet zunächst nur die zu testende Instanz.
Diese wird durch das darauf folgende closure eingeschlossen.

Das closure erwartet zwei Funktionsrefernzen:
Die Signatur der ersten Funktionsreferenz(pattern) erwartet hier die zu testende Instanz sowie den Rückgabewert Boolean wobei die zweite(resultHandler) ledeglich die zu testende Instanz erwartet (typisierte Funktionsreferenzen a la C# währen hier ne durchaus coole Sache btw.).
Wenn das übergebene pattern matched wird die Funktion resultHandler mit der zu testenden Instanz aufgerufen.

Das closure selbst gibt nun wiederrum eine Funktion nach folgenden Regeln zurück:
Wenn das angegebene pattern matched wird eine Funktion zurückgegeben die einfach nur sich selbst zurückgibt um sicherzustellen das folgende Aufrufe des "patternmatching" quasi ins leere laufen (hier liegt auch das größte performance Problem weil alle darauffolgenden matches diesen Prozess durchlaufen).
Wenn das angegebene pattern nicht matched wird die Funktion match mit derselben Instanz erneut aufgerufen.

In folgendem Beispielen soll getestest werden ob eine übergebene Instanz dem Typ String entspricht und wenn ja soll diese per trace ausgegeben werden.

Obwohl der compiler folgenden code ohne meckern akzeptiert:
Code:
var myString : String = "someString";
switch(myString) {
  case function(o : *) : Boolean {return o is String;}:
    trace(myString);

    break;
  case function(o : *) : Boolean {return o is String;}(myString):
    trace(myString);

    break;
  case 1 == 1:
    trace(myString);

    break;
}
matched nichts davon.
Damit fällt switch/case raus.

Hier nun das if/else Konstrukt:
Code:
var myString : String = "someString";
if(myString is Number) {
  trace(myString);
} else if(myString is SomeUnknownObject) {
  trace(myString);
} else if(myString is String) {
  trace(myString);
}
Und hier dasselbe mit der match Funktion:
Code:
function isInstanceOf(type : Class) : Function {
  return function(o : *) : Boolean {
    return o is type;
  };
}

match(myString)
(isInstanceOf(Number), trace)
(isInstanceOf(SomeUnknownObject), trace)
(isInstanceOf(String), trace));
Zwar mangelt es dem Beispiel etwas an Sinn aber ich hoffe es dient als ein gutes Beispiel für die Ausdrucksstärke die mithilfe nur sehr weniger Zeilen erzeugt werden kann.
__________________
http://blog.johannes-hodde.com

Geändert von JoH (29-04-2011 um 01:47 Uhr)
JoH ist offline   Mit Zitat antworten
Alt 01-05-2011, 09:48   #10 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Bremen
Beiträge: 13.358
Drei Arrays vergleichen
Omega Psi ist offline   Mit Zitat antworten
Alt 01-05-2011, 19:50   #11 (permalink)
JoH
Neuer User
 
Registriert seit: Dec 2005
Beiträge: 99
Weiss jemand zufällig wie der GC mit Instanzen umgeht die innerhalb einer anonymen Funktion erzeugt werden?
__________________
http://blog.johannes-hodde.com
JoH ist offline   Mit Zitat antworten
Alt 02-05-2011, 12:23   #12 (permalink)
Little Big Freak
 
Benutzerbild von Maciej
 
Registriert seit: Apr 2003
Beiträge: 305
Danke nochmal für die Beispiele, hab gestern schon bissl zum Thema Closures gelesen und werde mir eure Beispiele die Tage mal genauer angucken.
Maciej 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 19:04 Uhr.

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


Copyright ©1999 – 2014 Marc Thiele