Identifiant unique pour un objet
Par -Alexandre LEGOUT aka LAlex- le 19 août 2005, 14:55 - AS2 - Lien permanent
Pour des raisons de performances, il peut etre trés utile d'attribuer un identifiant unique à un objet. En effet, un identifiant numérique peut devenir index dans un tableau, et ainsi augmenter considérablement les performances pour retrouver celui-ci sans avoir à parcourir la totalité d'un tableau.
C'est pourquoi j'ai développé une classe ObjectCollector, qui permet d'attribuer un identifiant unique à un objet, et éventuellement de retrouver cet objet à partir de ce dernier, mais uniquement s'il a été "collecté" (on a pas toujours besoin de le retrouver par son id)... ![]()
/**
Utilisation :
* Collect objects and give them a unique Id.
* @author <a href="http://www.lalex.com/">LAlex</a>
* @version 1.0
* @since 2005-08-19
*/
class com.lalex.core.ObjectCollector {
// Stores last given id
private static var __id:Number = 0;
// Store collected objects
private static var __instances:Array = [];
/**
* If not already done, return a unique Id for the object
* @param o
* @return Object's unique id
*/
public static function uId(o):Number {
if (!o["__ocId"]) {
o["__ocId"] = ++__id;
_global.ASSetPropFlags(o, "__ocId", 7, 1);
}
return o["__ocId"];
}
/**
* Collect an object. Must be call before using getById method
* @param o Object to be collected
* @return Object's unique id
*/
public static function collect(o):Number {
__instances[uId(o)] = o;
return uId(o);
}
/**
* Release an object. Must be used
* before any delete of a collected object
* @param o Object to be released
*/
public static function release(o) {
delete __instances[uId(o)];
}
/**
* Release all collected objects
*/
public static function clear() {
var n:Number = __instances.length;
while(n-- > 0) {
release(__instances[n]);
}
}
/**
* Retrieve an object from its id
* The object must have been collected first
* @param id Object's id
* @see #collect
*/
public static function getById(id:Number) {
return __instances[id];
}
}import com.lalex.core.ObjectCollector;
// Objects
var o1 = {a:150, b:"LAlex"};
var o2 = {d:false, e:"Blablabla"};
// Collect the 'o1' object
var o1id = ObjectCollector.uId(o1);
trace("o1 id : " + o1id); // o1 id : 1
ObjectCollector.collect(o1);
trace("Retrieved ? " + (o1 == ObjectCollector.getById(o1id))); // Retrieved ? true
// Release 'o1' object
ObjectCollector.release(o1);
trace("Retrieved ? " + (o1 == ObjectCollector.getById(o1id))); // Retrieved ? false
// Get the 'o2' unique id
var o2id:Number = ObjectCollector.uId(o2);
trace("o2 id : " + o2id); // o2 id : 2
trace("Trouvé ? " + (o2 == ObjectCollector.getById(o2id)));// Retrieved ? false
Commentaires
Oui même je fais en gros la même chose depuis que j'ai pu voir cela dans le framework de Francis (Pixlib) .. j'utilise en fait un identifiant unique et les Map à la Javalike pour stocker mes objets et c'est clair que c'est tout bon au niveau des perfs.
[HS ou presque] On dirait au passage que pour le xml dans flash 8 ils ont insérés une nouvelle méthode pour récupérer des id au niveau des attributs des noeuds... comme on peut le voir ici : http://www.flashguru.co.uk/xmlidmap-node-lookup-table/#comments
J'ai forcément pas encore testé mais peut être que cela va permettre là aussi d'aller plus vite ? à voir
eka> Oui, en effet, c'est inspiré de pixLib (au passage, merci Francis ;))... Mais j'ai préféré externaliser la gestion des ids, plutôt que de l'intégrer au prototype de Object...
++ ^^
pour le clear, j'imagine que c'est encore pour les performances de tout virer un par un
c'est pour quel gain ?
initialiser le tableau c'est pas bon j'imagine
eka : le truc des ID dans le XML n'est pas nouveau
http://www.gotoandplay.ca/archives/2004/12/29/xpath-dans-mx-2004.html
par contre le idMap semble être nouveau
Euh oui avec du XPath c'est certain .. mais c'est pas du natif .. c'est ce que je voulai dire hein
Moi j'attends tjs l'ECMA 357 ... tout le monde en parlait en natif dans flash et flex2 .. mais pour le moment on dirait que c'est tombé à l'eau ?
neo> Argh... Dés fois, je me fatigue moi-même...
Non, non, il s'agit bien de natif... La classe XML reconnait l'attribut id dans une balise XML. Par contre, ce ne sera plus le cas dans Flash 8... Dommage pour la compatibilité ascendante, mais il faut s'y attendre avec les fonctionnalités non documentées... :p
Regarder dans la classe UIDUtil. Tout est prévu
Fil des commentaires de ce billet