Pipeline de processamento
Em sistemas reais, muitas vezes você precisa processar dados em sequência: filtrar, transformar e validar. Em vez de escrever uma função gigante, o padrão Pipeline organiza essas etapas em classes independentes que podem ser encadeadas com pipe(). Isso torna o código mais testável, reutilizável e fácil de modificar — comum em ETL, processamento de arquivos e streams de dados.
O PROBLEMA
Implemente Pipeline de dados: Pipeline, Stage, FilterStage, TransformStage, ValidateStage. Encadeáveis com pipe().
EXEMPLO
const pipeline = new Pipeline()
.pipe(new FilterStage(x => x.ativo))
.pipe(new TransformStage(x => ({...x, nome: x.nome.toUpperCase()})));
pipeline.processar(dados)SOBRE O CONCEITO
O exercício pede uma hierarquia de classes: Stage base, FilterStage, TransformStage e ValidateStage. Cada stage sobrescreve um método executar(item). O Pipeline armazena os stages em um array e, ao chamar pipe(), adiciona um stage e retorna this para permitir encadeamento. O erro mais comum é não retornar this no pipe(), quebrando o encadeamento. Outro erro é mutar os dados originais dentro do stage transformador — você deve criar uma nova cópia (usando map ou spread operator) para evitar efeitos colaterais. O método processar(dados) itera sobre cada item da lista, aplicando todos os stages em sequência (geralmente com reduce).
RESOLUÇÃO