Facade Pattern para un mejor manejo de estados en Angular
¿Qué es el Facade Pattern?
El Facade pattern, es un patrón de diseño utilizado, para reducir la complejidad de sistemas, agrupando funcionalidades de diferentes módulos enfocados a un caso de uso.
Dentro de una aplicación Angular, un facade no es más que un servicio inyectable, que puede a su vez comunicarse con otros servicios, exponiendo una API sencilla para consumirla en nuestro componente.
¿En qué me beneficia el uso de facades para el manejo de estado en angular?
El uso de facades, nos da una abstracción muy interesante de nuestra interfaz con nuestro estado, de forma que los componentes no conozcan ni dependan del manejo de estado, vamos a usar como ejemplo NgRx.
En NgRx, tenemos diferentes piezas que componen el estado de la aplicación: Store, Reducer, Actions, Effects, Selectors y si hacemos a los componentes UI conocedores de todos ellos, se hace bastante complicado el mantenimiento a la vez que la aplicación crece, en este momento es donde entra en juego nuestro facade. Empecemos creando un servicio que usa una sencilla interfaz.
Ahora crearemos nuestro facade service, donde haremos el mapeo de nuestros selectores a una propiedad pública que usaremos para subscribirnos .
Tras esto tendríamos que definir los métodos que llamaremos en nuestro componente.
Con todo esto, lo único que nos quedaría sería inyectar el facade service en el componente.
De primeras, puede parecer poco útil aplicar este patrón, ya que NgRx tiene muchos componentes que mantener, como para añadir un facade service, pero nos da el gran beneficio de abstraer todo ese manejo del estado de nuestro componente y nos aporta la gran versatilidad de poder cambiar la forma de manejarlo, sin tener que modificar el comportamiento de nuestros componentes, siempre y cuando respetemos la interfaz definida.
Los facade service nos permiten abstraernos de la complejidad del manejo de estado de nuestra aplicación
Es interesante utilizarlos incluso cuando iniciamos una aplicación que no sabemos el alcance que va a tener y si vale la pena utilizar un manejador de estado, ya que nos dará la versatilidad de empezar gestionando nuestros estado con simples servicios de RxJs y, llegado el momento, cambiarlo por cualquier librería que nos facilite esta tarea que, siempre que respetemos la API definida en nuestro facade service, nuestra aplicación seguirá funcionando de la misma manera.
Conclusión
El uso de facade service es muy útil para hacer nuestros componentes más tontos y con menos dependencias. lo que a la larga nos va a permitir mantenerlos con mayor facilidad, aunque no estemos usando ninguna librería para el manejo de estados.
Podéis ver ejemplos del uso de facade service, con diferentes librerías para el manejo de estados en el siguiente repo:
Cualquier duda, que tengáis podéis hacérmela en los comentarios o Twitter.