Proxy et Interval
Par -Alexandre LEGOUT aka LAlex- le mardi, août 22 2006, 14:02 - AS2 - Lien permanent
Pas grand chose de neuf en ce moment, je passe beaucoup de temps en maintenance de code. Du coup, je vous propose deux petites classes qui me servent énormément au quotidien. Chaque développeur qui passe ses journées dessus doit avoir un équivalent je suppose: une classe de proxy, héritière du fameux Delegate, et une classe Interval, qui m'évite la permanente prise de tête avec les ids des setInterval...
import com.lalex.core.CoreObject;
/**
* @author LAlex
* @class com.lalex.utils.Proxy
*/
class com.lalex.utils.Proxy
extends CoreObject {
public static function createFunction(o, f:Function):Function {
return create.apply(null, arguments).getProxyFunction();
}
public static function create(o, f:Function):Proxy {
var px:Proxy = new Proxy(o, f);
var args:Array = arguments;
args.splice(0,2);
px.setArguments(args);
return px;
}
private var _scope;
private var _fct:Function;
private var _proxy:Function;
private var _args : Array;
function Proxy(o, f:Function) {
_scope = o;
_fct = f;
setArguments(arguments.slice(2));
createProxyFunction();
}
private function createProxyFunction() {
_proxy = function() {
var ff = arguments.callee.f;
var fs = arguments.callee.s;
var fa = arguments.callee.a;
ff.apply(fs, arguments.concat(fa));
};
_proxy.f = _fct;
_proxy.s = _scope;
_proxy.a = _args;
}
public function getProxyFunction():Function {
return _proxy;
}
public function getFunction():Function {
return _fct;
}
public function setArguments(a : Array) {
_args = a.concat();
if (_proxy) {
_proxy.a = _args;
}
}
public function getScope():Function {
return _scope;
}
public function equals(p:Proxy):Boolean {
if (p.getScope() == _scope && p.getFunction() == _fct) {
return true;
}
return false;
}
public function launch() {
_proxy.apply(null, arguments);
}
}
import com.lalex.utils.Proxy;
/**
* @author LAlex
* @class com.lalex.utils.Interval
*/
class com.lalex.utils.Interval {
private var _itv:Number = -1;
private var _px:Proxy;
private var _tim:Number;
private var _nb:Number = 0;
private var _max:Number = Number.POSITIVE_INFINITY;
function Interval(tgt:Object, fct:Function, tim:Number, max:Number) {
_px = new Proxy(tgt, fct);
setTime(tim);
setMax(max);
}
function setMax( max : Number ) {
_max = max ? max : Number.POSITIVE_INFINITY;
}
function start( launchNow : Boolean ) : Void {
stop();
resume(launchNow);
}
function resume( launchNow : Boolean ) {
if (!isRunning()) {
if (launchNow) {
launchProxy();
}
_itv = setInterval(this, "launchProxy", _tim);
}
}
private function launchProxy() {
if (_nb++ < _max) {
_px.launch();
} else {
stop();
}
}
public function isRunning() : Boolean {
return _itv != -1;
}
function setTime( time : Number ) : Void {
pause();
_tim = time;
}
public function pause() {
if (isRunning()) {
clearInterval(_itv);
_itv = -1;
}
}
public function stop() {
pause();
_nb = 0;
}
}
Commentaires
Hello
C'est clair qu'au final on a tous en gros les mêmes
J'avais fait le choix
dans VEGAS de me baser sur la classe Timer AS3 au niveau du polymorphisme je
trouce sympa d'avoir du code AS2 ressemblant au code AS3 ^_^
EKA+
hophop 2 petite question
A quoi sert la classe proxy (j'en entend bcp parler mais je ne sait toujours pas a quoi ça correspond) ?
Ou puis'je trouver une bonne coloration syntaxique de préférence pour as, compatible dotclear1 ?
@klee> "A quoi sert la classe proxy (j'en entend bcp parler mais je ne sait toujours pas a quoi ça correspond) ?" Tu en as un bon exemple d'utilisation dans la classe Interval
"Ou puis'je trouver une bonne coloration syntaxique de préférence pour as, compatible dotclear1 ?" Cherche sur le forum de dotclear: http://www.dotclear.net/
++ ^^
Jolies sources ! Une question me taraude : mais que se cache-t-il dans coreObject ?
Alala j'était pas content de ta réponse, alors au lieu de m'enervé, j'ai cherché sur le forum de dotclear :D, j'ai trouvé et modifié Syntax Highlighter.
Ca peut interresser du monde, http://www.interlud.info/index.php/...
Sinon si j'avais pu comprendre proxy en lisant ton code, je n'aurais pas posé la question.
foxy: commente l'import et l'extends de CoreObject, c pas spécialement utile ici
@Raz-L> Pas plus que ton commentaire...
@Foxy> Rien de bien pharamineux: - une méthode kill() vide, a surcharger. - une méthode equals() : Boolean générique - une méthode getUId() : Number basée sur une vieille classe retravaillée: http://blog.lalex.com/post/2005/08/...
Wala, wala
Salut Lalex, pourrais tu commenter un peu ta classe Proxy , en effet je pense comprendre son utilité d'autant plus que tu la présentes comme l'heritière de Delegate mais j'ai un peu de mal à retrouver mes petits dans toutes ses méthodes.
Merci beaucoup en tout cas pour ta contribution
@Loctar> Une classe proxy sert à créer une fonction directrement avec le scope de cette fonction. En gros, on peut considérer que ca permet de sauvegarder le contexte d'appel d'une méthode, et que ca peut donc remplacer l'appel d'une méthode sur un objet par l'eppel d'une "bête" fonction.
Pour ce qui est des methodes:
class Banner {
private var _clip:MovieClip;
public function loadBanner(url : String) {
var ldr:MovieClipLoader = new MovieClipLoader();
ldr.onLoadInit = Proxy.createFunction(this, bannerLoaded);
ldr.loadClip(url, _clip);
}
private function bannerLoaded() {
setSize(Math.round(_clip._width), Math.round(_clip._height));
}
}
class Banner {
private var _clip:MovieClip;
public function loadBanner(url : String) {
var ldr:MovieClipLoader = new MovieClipLoader();
ldr.onLoadInit = Proxy.createFunction(this, bannerLoaded, url);
ldr.loadClip(url, _clip);
}
private function bannerLoaded(url : String) {
trace("Loading of " + url + " inited");
setSize(Math.round(_clip._width), Math.round(_clip._height));
}
}
Wala, wala
suffisait de demander
merci !
Merci beaucoup pour tes eclaircissement !!
Fil des commentaires de ce billet