Inyectar las dependencias
Cada capa recibe la de abajo como parámetro, en vez de crearla por su cuenta:
const store = crearStore(); // datos
const api = crearApi(store); // la API usa el store
const cliente = crearCliente(api); // el cliente usa la API (fetch)
A esto se le llama inyección de dependencias, y tiene dos superpoderes:
- Ejecutable: una vez conectadas, el flujo completo corre de verdad.
cliente.agregar("Pan")acaba creando la tarea en el store y devolviéndola, pasando por la API por el camino. - Sustituible y testable: como cada capa recibe la de abajo, puedes cambiarla sin tocar las demás. ¿Quieres una base de datos real en lugar del store en memoria? Le pasas otra implementación con los mismos métodos y la API ni se entera. Por eso se puede testear cada capa por separado.
En los ejercicios construyes cada capa y, al final, las conectas en una app que arranca, comprobando que el flujo de extremo a extremo funciona ejecutándolo.