You are on page 1of 5

Introduccin a la programacin dirigida por eventos

La programacin dirigida por eventos es un paradigma de programacin en el que el flujo del programa est determinado por eventos o mensajes desde otros programas o hilos de ejecucin. Las aplicaciones desarrolladas con programacin dirigida por eventos implementan un bucle principal o main loop donde se ejecutan las dos secciones principales de la aplicacin: El selector de eventos y el manejador de eventos. La mayora de libreras para el desarrollo de aplicaciones con GUI como GTK o Qt estn diseados para ser dirigidos por eventos, de ah el famoso sistema de ranuras y seales de Qt que no es ms que un patrn de diseo observer bastante currado.

Un poco de historia
A finales de los 70, los sistemas estaban pensados para trabajar como cadenas de ensamblaje donde un programa usaba una entrada y produca una salida que sera utilizada por otro programa como entrada para producir otra salida y as hasta finalizar el proceso. Este proceso mental de construir software es la base del desarrollo estructurado. El padre del desarrollo estructurado (que no de la programacin estructurada ojo) fue Larry LeRoy Constantine bajo el ala del Instituto de Investigacin de Sistemas de IBM. Uno de los mayores expertos y defensores de los mtodos estructurados es Edward Yourdon, tanto que las expresiones Yourdon y mtodos de anlisis y diseo estructurado son sinnimos.

Constantine y Yourdon definieron nuevos modelos de control del flujo de datos implementando lo que llamaron transacciones que en realidad son un patrn de diseo de manejadores de eventos.

En el diagrama de la derecha se muestra el siguiente proceso:


Un flujo de datos invoca eventos o lo que Constantine y Yourdon llamaron transacciones Un disparador los enva a manejadores especializados, Constantine y Yourdon lo llamaron centro de transacciones un conjunto de manejadores que se encargan de realizar operaciones sobre el flujo de datos

El trabajo del disparador es analizar los eventos para determinar su naturaleza y entonces enviarlos al manejador adecuado que es capaz de trabajar con eventos de esa naturaleza. El disparador tiene que procesar un flujo de eventos, as que su lgica debe incluir un bucle de eventos para poder enviar un evento a un manejador y volver a escuchar a la espera de nuevos eventos que disparar. Es comn que exista un evento especial que rompa el bucle y salga de la aplicacin, a ese evento se le llama evento finalizador y es muy comn en todas las libreras para escribir aplicaciones GUI. Tambin puede ocurrir que el disparador capture un evento de naturaleza desconocida o para el que no exista un manejador adecuado, en esos casos, el disparador debe descartar el evento o lanzar una excepcin. En algunas ocasiones es comn que el disparador y los manejadores no sean capaces de procesar los eventos con la suficiente premura conforme van llegando por lo que la mayora de aplicaciones basadas en GUI implementan una cola de eventos. Esta lgica es muy delicada y si no se implementa bien puede ser producto de cuellos de botella fatales.

Con la aparicin en los noventa de la programacin orientada a objetos nuevos diseos vieron la luz como ESA (Essential Systems Analysis) y JSD (Jackson System Development) que rompieron de forma brutal con la antigua manera de pensar en mtodos estructurados.

Arquitectura cliente-servidor
La arquitectura cliente-servidor es claramente una implementacin del patrn de diseo de manejadores de eventos. Podemos pensar en el servidor como un disparador de eventos que espera a la escucha de una peticin de un cliente que enva un evento y entonces el servidor lo re-enva a un manejador que lo procesa y devuelve un resultado. El servidor implementa el bucle de eventos que escucha de forma continua y procesa las peticiones reenvindolas a partes ms especialistas del servidor donde son procesadas y devueltas al cliente como respuesta. Si el bucle de eventos recibe una peticin extraa, sencillamente la descarta y emite un mensaje de error al cliente emisor.

Programacin GUI
La programacin grfica o programacin de GUI es dura, sobre todo si vienes del desarrollo web. Para empezar, todo elemento que conforma la interfaz de usuario de la aplicacin debe de ser definido con detalle. Su posicin, tamao, color, aspecto, comportamiento, etc, etc. Por eso existen los IDEs y los Frameworks, para hacernos la vida ms sencilla a los desarrolladores. En segundo lugar, la programacin con GUI es difcil por que existen muchos detalles y conceptos que dependen completamente del manejo de eventos. Cualquier Widget en la interfaz de usuario tiene uno o ms eventos asociados y a su vez emite uno o ms eventos hacia el mundo exterior. El hardware de entrada como el ratn y el teclado, tambin generan eventos y esos eventos tambin pueden ser capturados por los widgets de la interfaz de usuario. La mayora de herramientas de creacin de interfaces grficas de usuario se distribuyen como frameworks. Los frameworks implementan el bucle de eventos y la cola de eventos para que no tengamos que implementarlos nosotros mismos. Eso est bien, pero el mecanismo queda encerrado dentro del framework y si no estamos acostumbrados a la programacin dirigida por eventos algunos conceptos pueden resultar realmente confusos. Y no solo esos bucles quedan ocultos dentro del funcionamiento del framework, sino que tambin quedan ocultas mecnicas bsicas que es necesario comprender para llegar a tener un entendimiento claro de la magia detrs de este paradigma. Un ejemplo claro es el patrn observer.

El patrn Observer
La idea principal detrs del patrn observer es que existe una entidad con estados cambiantes y una o ms entidades observndola. Los observadores esperan a que la entidad observada les informe de un cambio de estado a travs de un evento que puede ser de su inters, por lo que los observadores se registran con la entidad observada. Cuando ocurre un evento, la entidad observada mira en su lista de observadores y notifica a aquellos que se registraron para recibir eventos de ese tipo. Los observadores dejaron instrucciones detalladas de como puede la entidad observada ponerse en contacto con ellos para recibir los eventos. A este patrn tambin se le llama El Principio de Hollywood como parodia de la tpica frase de Hollywood te llamaremos en cuanto tengamos un papel para ti. El sistema de ranuras y seales de Qt y el sistema de seales de GTK son ambos implementaciones del patrn de diseo Observer.

Eventos y MVC
En el patrn de diseo MVC los eventos y el patrn de diseo observer conforman el ncleo duro del funcionamiento interno del sistema. En en patrn de diseo MVC, el Modelo es un objeto que gestiona los datos y el comportamiento de la aplicacin, es la entidad observable en el patrn observer. Las Vistas se registran con el Modelo como observadores del mismo. Cuando el Controlador realiza cambios en el Modelo, notifica esos cambios a sus observadores registrados que modifican la interfaz de la aplicacin. En el patrn de diseo MVC los objetos de evento incluyen grandes cantidades de datos que viajan de una parte a otra de la aplicacin a travs del viejo y rado patrn de manejadores de eventos.

Programacin asncrona
La programacin asncrona pretende llevar este patrn de diseo a todos los aspectos del desarrollo de software por medio de mecanismos que articulan de una u otra forma el uso de eventos, seales y callbacks en todas las llamadas a funciones y mtodos llevados a cabo por la aplicacin utilizando adems mltiples hilos de ejecucin normalmente en una pila o piscina de hilos gestionada por un bucle de eventos extremadamente complejo. Algunos lenguajes como .NET lo incorporan como parte del lenguaje de facto (versin 3.0 o superiores). Otros lenguajes disponen de libreras, herramientas o frameworks que implementan la programacin asncrona. As tenemos Twisted para Python, EventMachine

para Ruby, Node.js para JavaScript, y muchas otras que seguramente desconozco para muchos otros lenguajes. En esta pequea introduccin a la programacin dirigida por eventos hemos hecho un repaso por la historia de este paradigma de programacin que lleva con nosotros mucho tiempo aunque para algunos es casi desconocido. En prximas entregas hablaremos sobre las diferentes herramientas a nuestra disposicin a la hora de programar de forma asncrona en escenarios donde se requiere de un tiempo de respuesta y rendimiento superior a lo normal.

You might also like