Sucios trucos. Hoy, crear instancias de clases dinámicamente
4 seguidores
Hace poco me preguntaban cómo instanciar clases a partir del nombre definido en un xml. Es algo que se hace desde hace tiempo, pero la verdad es que no se ve mucho, más que nada porque tampoco es que sea muy "limpio" que digamos.
El caso, he hecho un articulito que igual os puede interesar:
Crear instancias de clases dinámicamente
Que aproveche!
elsuricatorojo
Zárate
pd: no he probado lo de borrar las globales , pero es uno de mis peores suenyos : )
(Un poco OT) Yo hice en un día una clase para borrar absolutamente todo de un swf. En un momento la clase hacía:
<code>if (!acceso) {
for (var elem in _root) {
var tipo = typeof (_root[elem]);
trace(elem+" ---> "+tipo);
delete _root[elem];
if (tipo == "movieclip") {
_root[elem].swapDepths(100)
_root[elem].removeMovieClip()
}
}
for (var elem in _global) {
delete _global[elem];
}
}</code>
Te de deja la película limpia como el culito de un niño (nunca he entendido bien esta metafora :- )... si le das a Ctrl+Alt+V y no dejaba nada.
Lo de pasar los movieclips a depths positivos era eliminar los mc presentes en el timeline.
Del condicional se puede entreveer la intención diabólica de la clase.... La clase se construía pasandole un ID, cargaba un xml en nuestro servidor y si en el xml se decia que ese ID estaba asociado a un cliente "malo-malo-que-no-paga" pues acceso=false. Si el xml no decia nada o habia un error de conexión en su carga no pasaba nada. Lo malo en este caso era el tema del crossdomain (habia que dar de alta el servidor final donde se subiría la peli).
elSuricatoDiabolico
oskitar
Zárate
Oskitar, se puede hacer sin forzar el include. Si lo necesitas urgente lo preparo esta tarde o manayana.
Soy todo orejas.
Aunque no tengo prisa porque es un proyecto personal que estoy desarrollando pero me gustaría conocer tu solución.
juandelgado
Oskitar, se puede hacer sin forzar el include. Si lo necesitas urgente lo preparo esta tarde o manayana.
oskitar
Es que esta conversación ya la hemos tenido a medias en flashcoders y a medias en privado con Zarate.
Yo estoy haciendo una aplicación "escalable" en flash y me he encontado con ese problema serio, tengo un menú como los de cualquier aplicación windows, la estructura se crea desde un xml, y cada botón tiene una clase propia para poder meter funcionalidades propias a cada botón.
Ahora yo tengo "n" botones, pero si mañana alguien quiere añadir una funcionalidad más, en teoría solo debería incluir un item nuevo en el xml del menú y asignarle una clase dinámicamente, pero esto no es posible sin recompilar toda la aplicación, por el tema de incluir y forzar la declaración de la clase antes de poder vincularla dinámicamente.
Esto suena a chapa pero más o menos lo que vengo a decir es esto.
forzamos antes de asignar, para que el compilador sepa que existe.
<code>
import zarate.tv.test;
var force:test; // esta parte me jode sobre manera :D.
var clase = "test";
var boton = new (zarate.tv[clase]); //funciona
var boton = new zarate.tv[clase](); //este modo tambien funciona
</code>
Si quiero asignar a mi objeto "boton" la clase "test" dinámicamente, debo forzar antes la declaración de tipo para que el compilador incluya la clase.
Y si estoy construyendo dinámicamente un menu que se lee de un xml,
estoy obligado a incluir antes de la construcción del menu, el forzado de todas las clases que desee incluir.
Con lo cual pierdo la flexibilidad que estaba buscando para mi menú pues solo puedo asignar las clases que ya "conoce" mi aplicación, lo que me obliga a modificar y recompilar todo el menu cada vez que incluyo/incluyen un nuevo elemento de menu.
<code>
var clase = "test";
var boton = new (zarate.tv[clase]); //Esto no funciona
var boton = new zarate.tv[clase](); //Esto tampoco funciona
</code>
Peeeero y esto es lo flipante.
<code>
var boton = new (zarate.tv["test"]); //Esto si funciona
var boton = new zarate.tv["test"](); //Y esto tambien funciona
</code>
EA!
juandelgado
Para mi *es* sucio porque *obliga* a utilizar variables globales. Y si por cualquier razon algun zoteman decide hacer algo como:
<code>delete _global.com;</code>
Tu aplicacion se va a la kk. Y, para mi, dejara de ser sucio cuando en AS3 lo hagamos limpiamente con getDefinitionByName(). No me referia a que el recurso en si sea sucio, sino a que la implementacion actual lo es. Por eso encapsular todas las llamadas en una clase es importante, luego el paso de AS2 (sucio!) a AS3(limpio!) sera sencillo.
Ea!
pd: no he probado lo de borrar las globales, pero es uno de mis peores suenyos : )
elsuricatorojo
Creo que es sucio de lo util que es, mas o menos como "si da gustito es pecado". :-)
dagi3d
la programación dinámica es algo que se usa con relativa frecuencia y permite dotar a tus aplicaciones de una mayor modularidad(si no, no se podría hacer que los programas fuesen <em>'plugineables'</em> por ejemplo)
vamos, que de sucio nada :)
oskitar
¿Como que no es limpio?
Usuario desconocido
http://www.dandolachapa.com/
elsuricatorojo
Zárate queremos un blog tuyo ya!