Programación basada en eventos

Ajustar Compartir Imprimir Citar
paradigma de programación informática

En la programación informática, la programación impulsada por eventos es un paradigma de programación en el que el flujo del programa está determinado por eventos tales como acciones del usuario (clics del mouse, pulsaciones de teclas), salidas de sensores o mensajes. pasando de otros programas o subprocesos. La programación impulsada por eventos es el paradigma dominante utilizado en las interfaces gráficas de usuario y otras aplicaciones (por ejemplo, aplicaciones web de JavaScript) que se centran en realizar ciertas acciones en respuesta a la entrada del usuario. Esto también se aplica a la programación de controladores de dispositivos (p. ej., P en pilas de controladores de dispositivos USB).

En una aplicación basada en eventos, generalmente hay un bucle principal que escucha los eventos y luego activa una función de devolución de llamada cuando se detecta uno de esos eventos. En los sistemas integrados, se puede lograr lo mismo utilizando interrupciones de hardware en lugar de un bucle principal en ejecución constante. Los programas controlados por eventos se pueden escribir en cualquier lenguaje de programación, aunque la tarea es más fácil en lenguajes que proporcionan abstracciones de alto nivel, como await y closures.

Manejadores de eventos

Un manejador de eventos trivial

Debido a que el código para verificar eventos y el bucle principal son comunes entre las aplicaciones, muchos marcos de programación se encargan de su implementación y esperan que el usuario proporcione solo el código para los controladores de eventos. En este ejemplo simple, puede haber una llamada a un controlador de eventos llamado OnKeyEnter() que incluye un argumento con una cadena de caracteres, correspondiente a lo que el usuario escribió antes de presionar ENTER. llave. Para agregar dos números, se debe usar el almacenamiento fuera del controlador de eventos. La implementación podría verse a continuación.

globalmente declara el contador K y el entero T.
OnKeyEnter(caracter C)
{}
convertir C a un número N
si K es cero tienda N en T y aumento K
de lo contrario, añadir N a T, imprimir el resultado y restablecer K a cero
}

Si bien hacer un seguimiento del historial suele ser trivial en un programa secuencial porque los controladores de eventos se ejecutan en respuesta a eventos externos, estructurar correctamente los controladores para que funcionen cuando se les llame en cualquier orden puede requerir una atención y planificación especiales en un programa controlado por eventos.

Creación de controladores de eventos

El primer paso para desarrollar un programa controlado por eventos es escribir una serie de subrutinas, o métodos, llamados rutinas de manejo de eventos. Estas rutinas manejan los eventos a los que responderá el programa principal. Por ejemplo, un solo clic con el botón izquierdo del mouse en un botón de comando en un programa GUI puede desencadenar una rutina que abrirá otra ventana, guardará datos en una base de datos o saldrá de la aplicación. Muchos entornos de programación modernos proporcionan al programador plantillas de eventos, lo que le permite concentrarse en escribir el código del evento.

El segundo paso es vincular los controladores de eventos a los eventos para que se llame a la función correcta cuando se produzca el evento. Los editores gráficos combinan los dos primeros pasos: haga doble clic en un botón y el editor crea un controlador de eventos (vacío) asociado con el usuario que hace clic en el botón y abre una ventana de texto para que pueda editar el controlador de eventos.

El tercer paso en el desarrollo de un programa controlado por eventos es escribir el bucle principal. Esta es una función que verifica la ocurrencia de eventos y luego llama al controlador de eventos correspondiente para procesarlo. La mayoría de los entornos de programación dirigidos por eventos ya proporcionan este bucle principal, por lo que no es necesario que el programador de la aplicación lo proporcione específicamente. RPG, uno de los primeros lenguajes de programación de IBM, cuyo concepto de diseño de la década de 1960 era similar a la programación dirigida por eventos discutida anteriormente, proporcionó un bucle de E/S principal incorporado (conocido como el "ciclo de programa") donde los cálculos respondió de acuerdo con los 'indicadores' (banderas) que se establecieron anteriormente en el ciclo.

Manejadores de excepciones en PL/I

En PL/I, aunque un programa en sí mismo no esté predominantemente controlado por eventos, ciertos eventos anormales como un error de hardware, desbordamiento o "verificaciones del programa" pueden ocurrir que posiblemente impidan un procesamiento posterior. Los controladores de excepciones pueden ser proporcionados por "declaraciones ON" en llamantes (no vistos) para proporcionar rutinas de limpieza para limpiar después antes de la finalización, o para realizar operaciones de recuperación y volver al procedimiento interrumpido.

Usos comunes

La mayoría de las herramientas y arquitecturas de desarrollo de GUI existentes se basan en la programación dirigida por eventos. El marco Java AWT procesa todos los cambios de la interfaz de usuario en un único subproceso, denominado subproceso de envío de eventos. Del mismo modo, todas las actualizaciones de la interfaz de usuario en el marco de Java JavaFX se producen en el subproceso de la aplicación JavaFX.

Además, los sistemas como Node.js también están controlados por eventos.

Crítica

El diseño de los programas que se basan en el modelo de evento-acción ha sido criticado y se ha sugerido que el modelo de evento-acción lleva a los programadores a crear código de aplicación propenso a errores, difícil de extender y excesivamente complejo. Las máquinas de estado basadas en tablas se han defendido como una alternativa viable. Por otro lado, las propias máquinas de estado controladas por tablas sufren de debilidades significativas, incluido el fenómeno de explosión de estado. Una solución para esto es usar redes de Petri.

Roscado sin apilamiento

En los lenguajes de descripción de hardware se utiliza un enfoque basado en eventos. Un contexto de subproceso solo necesita una pila de CPU mientras procesa activamente un evento; una vez hecho esto, la CPU puede pasar a procesar otros subprocesos controlados por eventos, lo que permite manejar una cantidad extremadamente grande de subprocesos. Este es esencialmente un enfoque de máquina de estado finito.