martes, octubre 24, 2006

Cerca de la Competencia

Lo confieso, estoy aprendiendo .NET. Pero no significa que esté dejando de lado a Java, por el contrario, me sirve para comparar con un poco más de fundamento las ventajas y desventajas de ambos. Por cierto, les recomiendo el blog de Ramón Bosch, de la empresa Raona, es él quién está dictando el curso actualmente. Este artículo nace de la última clase donde Ramón hizo la siguiente pregunta "Qué piensan, ¿es conveniente usar excepciones?". Yo respondí un largo y convencido siiiii......, pero sin pensar en ningún fundamento. Y cuando Ramón dijo que no, fue cuando decidí poner mi cerebro en ON y tratar de pensar porqué no y que pasaría en Java.


Por qué No es bueno abusar de las excepciones

No hay que olvidar el objetivo de las excepciones, que es informar acerca de algo "excepcional", algo que no estaba contemplado. Yo mismo he cometido durante mucho tiempo el error de usar las excepciones para controlar lógica de programación. Por ejemplo: si creo para mi capa de negocio una excepción BusinessException para representar una condición de error en algún cálculo de la capa de negocio, eso está MAL!.
En lugar de eso debería encontrar otra forma como el retorno de un método que realiza el cálculo, o simplemente escribir un par de líneas de código adicionales y evitar que suceda el error, después de todo, se puede prever.

Qué pasa en Java con el manejo de las excepciones

En principio, si se ejecuta un bloque try sin que aparezca ninguna excepción, no se añade ningún procesamiento extra, sin embargo, depende de la máquina virtual que estemos ejecutando. Ahora, si se atrapa una excepción en un bloque catch, tendremos un procesamiento extra significativo. Esto se debe, principalmente a que se debe analizar todo la pila de llamadas (el famoso printStackTrace()).
Generalmente, en cuanto a performance de ejecución, la ejecución una excepción puede compararse con varios cientos de líneas de código.

Les recomiendo este PDF de la Sun Java One, se titula "Java Technology Performance Myths Exposed".

También Recomiendo el libro "Java Performance Tuning" para mayor información. Pueden comprarlo pero también pueden encontrarlo en el em...., ya saben donde.

Saludos PF

jueves, octubre 19, 2006

Thread Safety y los Servlets

Ok, hay un documento de la serie "Aprenda informática como si estuviera en primero", se llama "Servlets de Java", no está tan mal, bastante básico, pero siempre he pensado que para programar en Java de forma más o menos decente, se requiere una buena base. Es como si fuera una pirámide, si la base es la parte ancha, forma una buena estructura, si está al revés, es bastante peligroso e inestable. Por lo menos pensando de esta manera trato de dictar mis cursos.


Como Uds. saben, los servlets se ejecutan en un entorno multihilo (=multihebra), por lo que tenemos que tener mucho cuidado a la hora de escribir código en ellos. Se dice que el código que se escriba en un servlet debe ser "Thread Safe". No voy a detallar en forma exhaustiva todos los requisitos para que sea "Thread Safe", pueden ver un artículo interesante en wikipedia.

Quiero hacer incapié en uno sólo:


NO SE DECLARAN ARTIBUTOS EN LOS SERVLETS A MENOS QUE ESTEMOS MUY SEGUROS DE LO QUE ESTAMOS HACIENDO

Lo cierto es que el heap es compartido por todos los hilos de ejecución y sólo los parámetros de los métodos y variables de ese ámbito son exclusivas del hilo. Entonces, el declarar atributos en la clase Servlet, hará que esos atributos sean compartidos por todos los hilos de ejecución (recuerden que cada hilo representa la interacción con un usuario vía Internet/LAN), entonces se vuelve muy peligroso este tipo de prácticas.

La mejor recomendación que puedo hacerles es que no declaren atributos, ni se les ocurra poner synchronized en doPost/doGet y declaren siempre todas las variables locales al método.


Saludos, PF

miércoles, octubre 18, 2006

El programador del BINGO

El otro día leía en un blog, vaya a saber en cuál, que el error más temido por los programadores Java es el famoso NullPointerException.

Yo no estoy tan seguro de eso, en realidad pienso que todo depende de lo que estemos haciendo, pongamos un par de ejemplos, a ver:

  1. Estoy programando un sistema de control de tráfico aereo. (ver)
  2. Estoy programando un sistema de control de respirador artificial.
  3. Estoy programando un sistema de control de tránsito.
  4. Estoy programando un sistema de control de máquinas tragamonedas (ver)
  5. Estoy programando un sistema de compras por internet.
  6. Estoy programando un sistema de carga de curriculums por internet.
  7. Estoy programando mi página web de noticias RSS de 8 sistios distintos.

Salvo el punto 7, todos los demás asustan. En especial, no me gustaría ser el jefe de proyecto de las máquinas tragamonedas (hagan click en el link, en serio).
Pero no asustan porque pueda aparecer un NullPointerException, asusta la aparición de cualquier error, por mínimo que sea. La aparición del error significa pérdidas de dinero y a veces puede significar la pérdida de vidas.

Esto de ser Jefe de Proyecto y tener que dar explicaciones , me hace recordar un (sueño || pesadilla) que tuve hace un par de días atrás (¿fue un sueño?).
Si, fue un sueño por suerte y espero que nunca se haga realidad ;)
Pero a esto lo voy a dejar para otro post.

Saludos, PF


miércoles, octubre 11, 2006

Yahoo! UI Library (YUI) - Aplicando Patrones

En el post anterior, les conté que se puede hacer con las librerías de componentes JavaScript de Yahoo!. Aprender a utilizar los componentes es bastante fácil, pero planear una estrategia para brindar a nuestra aplicación una arquitectura robusta, requiere un poco más de atención.
Es aquí donde aparecen los patrones de diseño y de desarrollo. Pero antes, un par de preguntas,


¿Qué es un patrón?

Bueno, si ponen en el Google "patrones J2EE" van a encontrar muchísimas páginas relacionadas con los patrones arquitectónicos, para aquellos interesados en patrones básicos e imprescindibles hoy en día, les recomiendo los blueprints de Sun y por supuesto el clásico de clásicos "Gang of Four".


¿Cuál es el propósito de aplicar un patrón?

La respuesta es bastante simple, "No reinventes la rueda". (Si, lo dijo algún sabio, muchos lo escribieron en sus libros, muchos lo leímos en libros, nos lo contaron los profesores en la Universidad, lo escuchamos en cada Tech Day de cualquier lenguaje, y sin embargo, siempre tenemos que hacer todo desde cero).


¿Qué tienen que ver los patrones Yahoo! con los patrones J2EE?

Absolutamente nada, los patrones J2EE son patrones de diseño arquitectónico, optimizados para el desarrollo web en Java, en cambio, los patrones de Yahoo! son patrones de diseño de páginas web, sin entrar a detallar para nada, el código a ejecutar en el servidor. Esta diferencia es fundamental, para aquellos a los que le gusta el diseño y la arquitectura de sistemas, no busquen la solución en UML en los patrones de Yahoo! (al menos por ahora).

Ahora sí, los patrones:

Para tener un acceso rápido a la librería sigue el siguiente link Yahoo! Design Pattern Library.
Ahí van a encontrar un listado de todos los patrones de diseño que nos ofrece. Básicamente, cada patrón propone un resumen de aplicación y la solución (puramente visual). El problema con estos patrones es que deberemos tener en claro cuál es el problema que queremos resolver (si, ya sé, parece trivial, pero pasa muchas veces).
Recuerden que estos patrones resuelven problemas de diseño de interfaces y no de diseño arquitectónico de la aplicación, por lo que ni piensen en encontrar ejemplos de programación en Java ni en ningún otro lenguaje, de esa tarea ya se encargan los patrones de diseño arquitectónicos que mencioné en la primera pregunta.
Para aquellos que no somos de los diseñadores de interfaces más creativos, es un buen recurso para tomar como punto de partida antes de iniciar horas y horas de programación para mostrar un listado paginado. o para tratar de resaltar una información específica de un informe.
Si bien para algunos, puede parecer que la información que nos dan estos patrones es un poco trivial (como por ejemplo, el patrón "Search Pagination"), si eres de los míos, que no nacimos con el don de combinar colores agradables a la vista del usuario, siempre hay información útil, y más considerando que YUI nos brinda una serie de controles extraordinarios.

Saludos, PF

jueves, octubre 05, 2006

Conociendo el Yahoo! UI Library (YUI)

En este pequeño artículo vamos a ver que se puede hacer de interesante con el Yahoo UI Library (YUI). Para aquellos que no pueden esperar, aquí tienen la url de donde pueden bajarlo.

Básicamente, estas librerías consisten en una serie de utilidades Javascript para poder realzar nuestras aplicaciones web con componentes visuales tales como animaciones, cuadros de mensajes a medida, ventanas emergentes sin necesidad de abrir otra instancia de navegador, posibilidad de crear cuadros de autocompletar, calendarios, menús y muchas cosas más, entre las cuales, la que más debo destacar es la utilización de la tecnología AJAX.
En mi experiencia personal, he aplicado estos controles en proyectos de bastante complejidad, y debo decir, que para iniciarse en el desarrollo, no harán falta más de 30 minutos de lectura de tutoriales. De verdad son muy fáciles de usar, sin embargo, deberemos tener mucho cuidado al usar la tecnología AJAX, ya que deberemos crear una arquitectura robusta y escalable (quizá este sea el próximo tema).
No es la intención de este artículo analizar uno por uno los componentes de YUI, vamos a ver 2 de los más importantes y cómo utilizarlos en una aplicación web Java.
La aplicación que pueden ver en la imagen, es la presentación principal de nuestra página.


Ahora, veamos que sucede cuando hacemos click en el link:

La ventana que aparece a continuación es un componente "container" de YUI. Antes de pasar al código, un listado de lo que necesitaremos en la página:
  • Un campo
    vacío para alojar el formulario y resultado de la ventana emergente.
  • Un campo
    vacío para alojar el listado de personas que se irán añadiendo.
  • Un poco de paciencia para renegar con Javascript.
Veamos un poco el código para crearla:

<script language="javascript">

YAHOO.namespace("j2ee.panel");
YAHOO.j2ee.panel.panels = [];
var sUrl = '<%="http://localhost:8080/JavaBlogJ2EE/IndexAjax?a=buscar"%>';

function init() {
YAHOO.j2ee.panel.panel = new YAHOO.widget.Panel("win", { width:"25em",
height:"15em",
fixedcenter: true,
constraintoviewport: true,
underlay:"shadow",
close:true,
visible:false,
draggable:true, modal:false } );
YAHOO.j2ee.panel.panel.render();

YAHOO.j2ee.panel.panels["win"] = YAHOO.j2ee.panel.panel;
showForm();
}

function showForm(){
var request = YAHOO.util.Connect.asyncRequest('GET', sUrl, callback);
}

YAHOO.util.Event.addListener(window, "load", init);



Describo ahora un poco las líneas de código:

Por supuesto que deberemos tener en el index.jsp/php/asp/aspx/html los correspondientes enlaces a los archivos js de la biblioteca.
Ahora bien, con estas librerías podemos definir referencias al mejor estilo C#, utilizando la palabra "namespace". Es muy útil definirlo para poder utilizar el enlace con mayor facilidad más adelante. En el método init() es donde la ventana emergente se crea por primera vez. Si se fijan con cuidado, es aquí mismo donde podemos definirle es aspecto general.
En el método showForm() utilizamos el componente AJAX de YUI YAHOO.util.Connect. Este objeto nos permite realizar llamadas GET o POST, y obtener el resultado (resultado correcto o un error). para ello, deberemos utilizar un objeto del tipo "callback". Para los que no se sientan familiarizados con este término, una explicación rápida es compararlo con el patrón Observer y el modelo de eventos de Swing.

Ahora, podemos buscar personas por nombre utilizando un componente de conexión AJAX de la misma librería y agregarlos a un listado, todo sin necesidad de recargar la página, vean:


El ejemplo anterior, lo pueden bajar de la siguiente dirección. En próximos artículos, deambularemos por el código.

Como conclusión de este artículo puedo decirles que si bien estas librerías no serán ni contendrán todo lo que necesitamos, les aseguro que nos ahorrarán un poco de trabajo al obtener de forma rápida, resultados más dinámicos y en poco tiempo. Recomiendo leer la documentación oficial, que contiene muchísimos mas ejemplos de otros componentes.

Saludos