Injetar as dependências
Cada camada recebe a de baixo como parâmetro, em vez de criá-la por conta própria:
const store = criarStore(); // dados
const api = criarApi(store); // a API usa o store
const cliente = criarCliente(api); // o cliente usa a API (fetch)
Isso se chama injeção de dependências, e tem dois superpoderes:
- Executável: uma vez conectadas, o fluxo completo roda de verdade.
cliente.adicionar("Pão")acaba criando a tarefa no store e devolvendo-a, passando pela API pelo caminho. - Substituível e testável: como cada camada recebe a de baixo, você pode trocá-la sem mexer nas demais. Quer um banco de dados real no lugar do store em memória? Você passa outra implementação com os mesmos métodos e a API nem percebe. Por isso dá para testar cada camada separadamente.
Nos exercícios você constrói cada camada e, no final, as conecta em um app que inicia, confirmando que o fluxo de ponta a ponta funciona executando-o.