martes, 21 de agosto de 2007

Programación orientada a objetos sencilla y elegante

La mayoría de los programadores cuando piensan en programación orientada a objetos piensa en java o c++, pero hay muchos lenguajes que implementan esta técnica y algunos mucho mejor que en c++ y java.

Me ha llamado la atención python, para mí uno de los mejores lenguajes para aprender orientación a objetos, más que nada, por su sencillez.

¿Qué hay que hacer para definir una clase en python?
Imaginemos que queremos definir una clase llamada pareja que tiene dos atributos, con una única operación, sumarlos.

class pareja:
def __init__(self, a=0, b=0):
self.a=a
self.b=b
def sumar(self):
return self.a+self.b

Simplemente eso, __init__ siempre es el constructor, y tal y como lo he definido se pueden crear objetos así:

p=pareja(2,3)

O así:

p=pareja()

O incluso así:

p=pareja(b=2)

Añadiendo un parámetro más, ¡se puede tener el constructor por defecto, por parámetros y por copia con un mismo método y así de simple!

Otro aspecto son los iteradores, tanto en java como c++, cuando quieres recorrer un array, con un iterador, hay que declarar el iterador indicando su tipo, crear un bloque for que vaya desde it.begin hasta it.end, etc...

En python esto es mucho más fácil, ¿como se recorre un array de objetos?

for i in array:
print i

Da igual si el array es de números, de listas, de objetos complejos, o incluso si el array es una cadena de carácteres.

Una última cosa, normalmente hay que pelearse con las bases de datos para ir guardando los objetos, vamos, para que sean persistentes. En python esto no es problema, simplemente haciendo:

pickle.dump(objeto, fichero)

Se guarda el objeto en el fichero, y haciendo:

objeto=pickle.load(fichero)

Se carga el objeto desde el fichero, sin más complicaciones.

jueves, 9 de agosto de 2007

Aprendiendo AJAX desde cero

AJAX es una tecnología usada para la web, permite la carga asíncrona de contenidos. Los que no sepais que es os pongo un ejemplo muy sencillo.

Si entráis a hotmail (no windows live), y queréis leer un mensaje, hacéis click en el enlace y tenéis que esperar a que cargue la nueva página. En gmail, por el contrario, pincháis en el mensaje que quereis leer y se despliega, no hace falta esperar a que cargue de nuevo toda la página.
El segundo método de carga usa AJAX, mientras que el primero es una petición al servidor de las de toda la vida.

AJAX no es nada por si mismo, es la unión de javascript, el objeto XMLHttpRequest y XML.

La arquitectura de una aplicación AJAX es la siguiente, se tiene un programa en javascript en el cliente, y este, mediante el objeto XMLHttpRequest se comunica con el servidor según convenga mostrando directamente el resultado en el cliente. No es necesario recargar la página, lo que se hace es ir cambiando el contenido dinámicamente sobre la misma página.

Cuando digo que se comunica con el servidor puede ser tanto desplegar una opción, como cambiar el texto de toda la página o mandar una petición al servidor para darnos de alta, cualquier cosa.

¿Cómo se crea el programa en javascript para poder comunicarse con el servidor? Pues lo primero es un método casi estándard, la creación del objeto XMLHttpRequest de la siguiente forma:

if(window.XMLHttpRequest) { obj=new XMLHttpRequest(); }
else {
try { obj=new ActiveXObject("Microsoft.XMLHTTP"); }
catch (e) { alert('El navegador no tiene el objeto XMLHttpRequest'); }
}

Después, para hacer las peticiones hay que usar un código como el siguiente:

obj.open('GET', 'registro.txt');
obj.onreadystatechange = tratarTexto ;
obj.send('');

Creado el objeto, mandamos (por el método GET) una petición al servidor del fichero registro.txt, cuando cambie el estado del objeto XMLHttpRequest se llamará a la función 'tratarTexto'. Esta función puede ser algo como lo siguiente:

if(obj.readyState==4){
respuesta=obj.responseText;
zonaRegistro=document.getElementById(zonaRegistro);
zonaRegistro.innerHTML=respuesta;
}

El estado 4 es el estado en el que la petición ha finalizado correctamente, en la documentación se pueden consultar los demás estados por si son necesarios.
Obtenemos el objeto que apunta al elemento de la página 'zonaRegistro' y lo rellenamos con la respuesta que hemos obtenido en el servidor.

Para terminar, supongamos que el registro que estábamos manejando arriba viene de un formulario, en lugar de mandarlo a un script en perl (por ejemplo) lo que hacemos es mandar una petición a dicho script mediante el objeto XMLHttpRequest. Por ejemplo:

<form name="formulario" action="javascript:peticionAJAX('script.pl', parametros);">

De esa forma podemos hacer una petición de registro al servidor mediante el script 'script.pl' y que cuando este termine y nos deje la información en 'registro.txt' devolvérsela al cliente, todo eso sin tener que recargar la página.

En este caso nos hemos comunicado con el servidor recibiendo tan solo texto, pero también se puede entregar el texto formateado en XML, es un poco más complejo, pero tampoco demasiado.