Post

ZIO e Programação Funcional: Domando Efeitos Colaterais no Java/Kotlin

ZIO e Programação Funcional: Domando Efeitos Colaterais no Java/Kotlin

Se você vem do mundo Java tradicional, o termo “Efeito Colateral” (Side Effect) pode parecer algo ruim. Mas na verdade, quase tudo o que fazemos (salvar no banco, enviar e-mail, ler um arquivo) é um efeito colateral. O segredo do ZIO (muito usado em Scala e outras linguagens funcionais) é tratar esses efeitos como dados.

O Código que não Mente

Imagine uma função que diz retornar um User, mas na verdade ela pode lançar uma IOException ou travar o sistema por 10 segundos. O tipo de retorno User está “mentindo” para você. No ZIO, o tipo de retorno diz exatamente o que a função faz, o que ela precisa e como ela pode falhar.

O que é um Efeito (ZIO)?

Um ZIO<R, E, A> é como uma receita de bolo:

  • R (Environment): O que eu preciso para rodar? (ex: uma conexão com o banco).
  • E (Error): Como eu posso falhar? (ex: DatabaseError).
  • A (Value): O que eu entrego se der certo? (ex: User).

Exemplo Prático (Conceitual em Kotlin/ZIO)

1
2
3
4
5
6
7
8
// Uma função pura que descreve um efeito, mas não o executa ainda
val creditBenefit: ZIO<Any, BenefitError, Success> = 
    ZIO.attempt { 
        // Lógica de crédito aqui
    }.mapError { BenefitError.ServiceUnavailable }

// Só executamos no "fim do mundo" (Main)
runtime.run(creditBenefit)

Por que usar isso em vez de CompletableFuture?

  1. Type-Safety de Erros: Você é obrigado a tratar os erros ou declará-los no tipo. Nada de try-catch espalhados.
  2. Concorrência Declarativa: Quer rodar 10 tarefas em paralelo e parar tudo se uma falhar? Com ZIO é uma linha de código: ZIO.collectAllPar(list).
  3. Testabilidade: Como os efeitos são apenas descrições, você pode “trocar” a implementação do banco por um mock apenas mudando o parâmetro R.

Curiosidade: O Conceito de Monad

Embora o nome assuste, uma Monad (como o ZIO) é apenas um padrão de design que permite encadear operações mantendo o contexto. Se você usa Optional ou Stream no Java, você já usa monads sem saber!

Uma Provocação sobre Honestidade no Código

Se as suas funções Java ou Kotlin pudessem falar, elas diriam toda a verdade sobre o que fazem “por baixo dos panos”? Quantas vezes um simples retorno de List<String> esconde um potencial erro de rede ou um estouro de memória? Migrar para um modelo orientado a efeitos como o ZIO não é apenas uma escolha sintática, é um compromisso com a transparência arquitetural. Estamos prontos para admitir que todo código de produção é, na verdade, uma gestão complexa de falhas e dependências externas?

This post is licensed under CC BY 4.0 by the author.