La programación reactiva es un paradigma de programación del que ya habrán escuchado, y seguramente comenzarán a escuchar mucho más en el futuro, acá hay que decir que el hecho de que sea un paradigma por si mismo, no significa que sus implementaciones no se traslapen con otros como la programación funcional o la orientada a objetos. En fin, este paradigma, el reactivo, tiene dos objetivos principales:

  1. Propagar los cambios en un sistema requriendo la menor cantidad de esfuerzo.
  2. Hacer más sencillo el trabajar con flujos asíncronos de datos.

Pero bueno, vamos a ver ejemplos de esto:

Para el caso de la propagación de los cambios imagina una hoja de cálculo, en la que tomas una celda y le colocas una fórmula que, digamos, depende de los valores de otras dos celdas. Luego cuando colocas valores estas celdas referenciadas, el valor de la primera automáticamente cambia, reaccionando a los cambios. Efectivamente, los cambios se propagaron en nuestro sistema.

Para el segundo caso, el de flujos asíncronos de datos, imagínate una hoja el un procesador de texto. Cada vez que presionas una tecla, estás enviando un dato, entonces el procesador de textos reacciona de acuerdo a como fue programado para hacerlo, en este caso, colocar la letra en donde corresponde. Este flujo es asíncrono porque… el programa no sabe cuándo vamos a escribir la siguiente letra.

En ambos casos la programación reactiva es una gran candidata para afrontar los problemas de diseño e implementación de aplicaciones con requerimientos similares.

Es más, podríamos reducir la programación reactiva a simplemente una herramienta destinada a trabajar con flujos de datos asíncronos, en el caso de la hoja de cálculo consideramos que cada valor nuevo en una celda es solo otro dato al cual se debe reaccionar.

Pero, para ver un poco de código en este video, considera el siguiente:

int a = 2;
int b = 5;
int c = a + b;
a = 5;
Console.Write(c);

¿Cuál será el valor de c al final?

Si definimos este escenario bajo la programación reactiva el valor de c sería 10, puesto que c define la relación entre a y b, y cualquier cambio que ocurra tanto en a y en b se verá inmediatamente reflejado en c.

Si estás familiarlizado con los patrones de diseño, te darás cuenta de que la programación reactiva es una forma de implementar el patrón del observador. Acá tengo un video que hice sobre los patrones por si quieren saber más.

FRP

Hasta ahora hemos estado hablando de la programación reactiva, sin embargo, actualmente es muy común que se encuentren una mezcla muy poderosa de la programación reactiva y la programación funcional, de nuevo, un traslape de paradigmas. Algo conocido como programación reactiva-funcional o FRP, la programación funcional merece su propio video, sin embargo, para el contexto de la programación reactiva basta con decir que la programación funcional nos ofrece la posibilidad de filtrar, convertir y resumir* los flujos de datos en otros que sirvan mejor a los propósitos de nuestra aplicación.

Piensa nuevamente en el procesador de textos, supón que este está conectado directamente al flujo de datos proveniente del teclado, cuando el usuario presiona una tecla que no sea una letra o un número, el procesador de texto debe filtrar este flujo, de tal modo que no considere teclas que no sean letras o números.

Si buscan programación reactiva en internet, se van a encontrar con diagramas de este tipo:

En donde el flujo, o flujos, de datos originales se observa en la parte superior, seguidos de la operación que se le aplica, y al final el flujo resultante, en este par de sitios pueden ver e interactuar con estos diagramas: rxmarbles y Rx Visualizer.

Rx

Mientras que cada lenguaje de programación tiene su propia manera (y hasta tu podrías crear la tuya) de implementar la programación reactiva, podrías tomar ventaja de las cosas que la comunidad ha desarrollado. Y esto lo puedes hacer a través de una API multiplataforma llamada Reactive Extensions o Rx, que permite crear y consumir flujos de datos. En el contexto de Rx los flujos de datos se conocen como Observables y quienes estan atentos de ellos son los Observadores.

En Rx los observables (es decir, los flujos de datos) tienen una operación básica: la de aceptar las suscripciones que reciben.

Mientras que los observadores tienen tres operaciones básicas: ma

  • Reaccionar al siguiente valor provisto por el flujo
  • Reaccionar cuando el flujo le informe que se ha completado
  • Reaccionar a un error ocurrido dentro del flujo

Esto u sando las extensiones reactivas para .NET se ve así: pero si quieres ver un ejemplo completo puedes visitar este post.

Sin embargo, como dije, las extensiones reactivas son multiplataforma y están disponibles para Java, Scala, Clojure, Swift, Go, Ruby y demás.

Usos

Es también bueno mencionar que no porque tengamos al alcance esto de la programación reactiva tenemos que aplicarlo a todo lo que nos encontramos, no, siempre hay que buscar la mejor herramienta para el trabajo, y eso es justamente Rx una herramienta. Habiendo dicho esto, hay algunos escenarios que son altamente susceptibles de afrontar usándola, entre ellos tenemos:

  • Aplicaciones con interfaz gráfica en la que el usuario intereactúe con la aplicación: hace rato hablamos del teclado, pero podrías aplicar la misma idea de flujo a los clicks que hace el usuario o a los botones de un control de consola.
  • Cuando estés trabajando con información en tiempo real como por ejemplo las lecturas provistas por un termómetro, un sismógrafo o, en el caso de los automóviles autónomos, la inmensa cantidad de información que reciben a través de sus sensores.
  • Estés trabajando con flujos interminables de datos como la inmensa cantidad de tweets que existen, o las transferencias bancarias que ocurren en un banco al día.