Pedro del Gallego's Weblog
miércoles agosto 13, 2003
Revisado : El patron Front Controller 1ª parte Bueno siguiendo el consejo de
Al, he decidido cambiar la implementacion del ActionFactory para que solo se instancie una vez cada accion y luego se reutilice esta instancia el resto de las veces.
public class AccionFactory {
// tabla para guardar las acciones
private static Hashtable mapaAcciones = new Hashtable();
public static Accion getAccion(String accion){
Accion action = (Accion) mapaAcciones.get(accion);
if (action==null){
try {
action = (Accion)Class.forName(accion).newInstance();
mapaAcciones.put(accion, action);
} catch (InstantiationException e) {
System.out.println("Error al instanciar la clase");
e.printStackTrace();
} catch (IllegalAccessException e) {
System.out.println("Acceso Ilegal a no se que ¿?");
e.printStackTrace();
} catch (ClassNotFoundException e) {
System.out.println("Tas tonto esa clase no existe");
e.printStackTrace();
}
}
return action;
}
}
Bueno en principio cada clase que implemente accion se instancia una unica vez y es almacenada en una Hashtable. Pero no daria esto problemas de concurrencia si se solicitan a la vez dos instancias de esa accion? no termino de verlo del todo claro... voy a darle un par de vueltas a ver si veo donde me he perdido. + criticas please...
Bueno a parte de esto he hecho una pequeña modificacion para que el fichero de configuracion quedase tal que asi:
comprar=comprarAccion
elegir=elegirAccion
devolver=devolveAccion
buscar=buscarAccion
inicio=inicioAccion
Que siempre queda algo mas fino. Para extraer la accion de la URI he añadido el metodo
private String getClassName(String nombre){
int barra = nombre.lastIndexOf("/");
int punto = nombre.lastIndexOf(".");
if ((barra<=0)&&(punto<=0)) return nombre;
return nombre.substring(barra+1,punto);
}
PD Al, de esta semana no pasa que no me baje el codigo y la documentacion de Cañamo. No se si sabre implementar algo o sugerir alguna mejora del diseño, pero por lo menos que no se diga que no lo intento (Que despues hablamos de sensacion de comunidad y de implicacion, y yo soy el primero en dar mal ejemplo). Ademas que ya has tirado unas cuantas indirectas y muchos nos hacemos lo locos, ya va siendo hora.
( ago 13 2003, 05:35:22 PM CEST )
Permalink
URL de la referencia: http://weblogs.javahispano.org/akuma/entry/revisado_el_patron_front_controller1
porqué no usas un HashMap en vez de HashTable, que tiene todos sus métodos sincronizados?
Como sólo vas a hacer lecturas concurrentes del mapa de acciones, no tienes que preocuparte de la sincronizacion de los hilos... así que no tendrás a usuarios esperando a que otro salga de la sección critica, o algo asi no? :)
Enviado por viTxo en agosto 13, 2003 a las 08:29 PM CEST #
Pues basicamente, por que no me habia acordado que HashTable fuese sincronizado, lo he cogido directamente de la API. Voy a reescribirlo y probar si con HashMap funciona....listo, funciona perfectamente. Voy a reeditar el post
Enviado por Akuma en agosto 13, 2003 a las 09:20 PM CEST #
Bien, varias cosas. El tema de la concurrencia lo puedes encontrar en <a href="http://weblogs.javahispano.org/page/al/20030814#sobre_el_front_controller">mi weblog</a>, el resto te lo dejo por aquí.
Primero, Vitxo, en este caso, al instanciarse las clases cuando se requieren, si que sería deseable que el acceso al Map fuera sincronizado (aunque bueno, no debería ser un gran problema), así que el HashTable esta bien :-).
Sobre obtener el nombre del la acción. Bien, calcula que vas a hacer más veces, meter el nombre de la acción dentro del mapa o sacarlo de él. Obviamente lo segundo, así que te puedes de ese método <i>getClassName</i> si metes las acción en el mapa de la forma <i>"/" + nombre + "." + sufijo</i> ;-).
Lo que estas haciendo, la factoría, al tener el mapa y demás empieza a oler a Singleton, y poner esa tabla como pública es un delito!.
Sobre Cáñamo, me encantaría. Ahora mismo tenemos un grupito majito con ganas (3 y medio!), así que me creo que puede salir algo interesante. Este sería un buen momento para meterse con ello.
Enviado por Al en agosto 14, 2003 a las 09:03 AM CEST #
Mea culpa, puse public sin darme cuenta. Me condeno a un dia y 1 hora de trabajos forzados en el patron Singleton ;-)
Enviado por Unknown en agosto 14, 2003 a las 11:44 AM CEST #
Bueno para aquellos que no lo hayais visto, la discusion se esta manteniendo aqui y en el blog de <a href="http://weblogs.javahispano.org/comments/al?anchor=sobre_el_front_controller">Al</a>,, para mi esta siendo una charla muy productiva.
Espero mas sugerencias y críticas...
Enviado por Akuma en agosto 15, 2003 a las 03:07 PM CEST #