Interceptores y JavaScript

Primero que nada decir que estoy armando este post desde el celular. Lo que puede llevar a horrendos errores gramaticales y ortográficos. Y se debe a que aún no cuento con acceso a internet (Larga historia).

Segundo, el tema de este post. Básicamente hace bastante tiempo venía pensado cómo poder simular algo cercano a AOP pero en Javascript. Claro, no todo el compendio de AOP, o no rigurosamente, pero algo.

Ese algo, para este caso se limitaba a interceptores en las diferentes llamadas a funciones. Como en el caso de lenguajes como C# o Java, dónde es posible decorar una función para obtener un comportamiento previo a la ejecución de la misma.

Un ejemplo es el clásico caso de los controllers de un proyecto MVC. Algo como:

[HttpPost]
public void HacerAlgo() ...

En este caso el decorador hace que dicha función sea ejecutada solo si se produce una llamada de tipo POST.

Por supuesto, esto no es necesariamente AOP. Pero por lo menos nos permite encapsular comportamiento por fuera de la función y esperar el mismo cada vez que decoramos una función.

Entonces el siguiente paso a pensar es: Qué pasaría si quiero escribir un log antes de que la función sea llamada. O mejor aún: Qué pasa si quiero que un set de reglas se ejecute antes de entrar a la función, como por ejemplo, validar que los campos no estén vacios.

[Validar(variable="nombre", empty=false, throwException=true)]
public void MiFuncion(string nombre) ...

En este caso si al llamarse la función la variable nombre se encuentra vacía, entoces se produce una excepción.

Nuevamente, esto no es AOP real, pero para el ejemplo pensemos que es una aproximación.

El punto a evaluar es que podemos obtener conportamiento repetible adicional a nuestra función sin tener que repetir el mismo código dentro del cuerpo de la misma. Y si bien no nos liberamos del acoplamiento, si podemos tener algunos beneficios próximos al mismo.

Tal vez en el caso de AOP, al momento de compilar deberíamos obtener nuevas funciones con dicho código incorporado en ellas. En el ejemplo de C#, por el contrario, necesitamos de un observador que controle el comportamiento de los objetos, clases y funciones, use algún modelo de reflection e inyecte comportamiento mientras las funciones son llamadas.

Esto quiere decir que la estructura de la función no muta en base a nuestras decoraciones.

¿Pero qué pasa con Javascript?

Bueno, resulta un poco más difícil ya que los métodos reflectivos que tenemos disponibles (Hasta donde yo se) no nos permiten decorar y leer esas decoraciones. (Usuarios de React y Redux y demases abstenerse, eso tiene una capita adicional)

Pero sí podemos recrear una función de forma dinámica. Esto es: Tomar la función existente y sobre escribirla a nuestro gusto en tiempo de ejecución.

Toda esta cantaleta para llegar a esto.

En la imagen se puede ver un objeto en el que tenemos una función que recibe dos parámetros. El primero llamado p y el segundo __interceptor. Y es el segundo el que me interesa.

¿Que pasaría si este dictaminará que dicha función, al ser llamada, debiera primero ejecutar alguna acción definida en ese interceptor y luego, si todo sale bien, seguir el camino esperado?

En la imagen lo que terminé armando.

Básicamente la posibilidad de definir dicho interceptor (o varios en cadena). Que modifican el comportamiento original de la función. La sobre escriben y la dejan lista para ser usada con el nuevo código inyectado.

Como vemos en la consola. Al llamar a las diferentes funciones, antes, los interceptores son ejecutados para luego dar paso al código de las funciones originales.

Algunas aclaraciones.

El código es algo largo como para pegarlo en este mismo post por lo que trataré de colocarlo en GitHub en breve.

No lo hice en ES6 o TypeScript por falta de compiladores.

Seguro hay mejores implementaciones. Angular tiene cosas así. PrototypeJs creo que también. Pero ya saben… Es divertido hacerlas uno mismo.

Por último, una vez suba el código aprovecharé para armar otro post explicando algunas partes.

Espero que les resulte interesante 😛

Anuncios

¿Volvemos?

Hace muchísimo tiempo que dejé este blog y lo cambié por los videos en YouTube. Pero mucho contenido creado en esos videos hubiesen funcionado mejor en este espacio.

Por eso, me parece que volveremos por estos lugares. 😉


MVP no more

Bueno, recién llega el correo donde dice que este año ya no seré reconocido como MVP.

Desde el 2004 hasta ayer. Un buen número.

Todo cambio tiene sus cosas buenas, entre algunas, mi inicio en la carrera de Psicología y mi inclinación por el mundo de la gestión de proyectos gracias a Scrum y las formas Agile.

En fin, será hasta pronto.


Cargado automático de entidades

Si bien hace mucho que no dedico tiempo a publicar código, más que nada debido a mis estudios en Psicología, y por otra, tratando de criticar un poco el mundo del desarrollo de software por medio de dibujos, hace unos días algunos alumnos me pidieron plantear una forma en la cual se pudiera cargar datos desde una base de datos de una forma simple. Esto es, sin tener la necesidad de crear grandes mapeos o cantidad innumerable de objetos que hicieran una copia uno a uno de los datos recogidos desde un DataReader hacia las propiedades de una entidad…

Si querés leer todo, entra a mi otro blog: http://alligned.net/blog/


Historietas sobre informática

Hace un tiempo estoy dedicándome a realizar dibujos relacionados al desarrollo de software y afines.

Todos estos han sido publicados en el blog: www.alligned.net/blog

De cualquier manera, los coloco aquí para que puedan verlos. Espero que les gusten.

GerencialI
 
Bugs
Estimacion
JefeI
Cablecortis
Descartes
CartelesMotivacionales
Biencomun      
SoftwareFactory
SoftwareIgual
Semejantes


Agile Open Córdoba 2010 – Se viene una nueva entrega

OpenAgile2010Así es. Se viene una nueva entrega del evento Agile Open Córdoba donde practicantes de formas de desarrollo y gestión Agile se reúnen para intercambiar conocimientos, sacando conclusiones sobre mejores experiencias para la aplicación en la vida real.

Más información aquí: http://alligned.net/blog/?p=60


Algunas historietas

He publicado en el blog de Alligned algunas historietas… espero que les guste:

http://www.alligned.net/blog