O Que É um Efeito Colateral? Quando o Código Muda o Mundo
Um efeito colateral é qualquer mudança observável que uma função causa além de retornar seu resultado, como escrever no disco, chamar uma API ou mutar estado compartilhado.
Uma função sem efeitos colaterais apenas computa e retorna um valor. No momento em que ela faz qualquer outra coisa observável, escreve um arquivo, imprime saída, envia uma requisição, muda um global, ela tem um efeito colateral. Efeitos colaterais são como os programas de fato realizam trabalho útil, mas também tornam o código mais difícil de testar, raciocinar e executar com segurança em paralelo.
O que conta como efeito colateral
- Escrever no disco, em um banco de dados ou na rede.
- Mutar uma variável ou objeto fora da função.
- Imprimir no console ou registrar em log.
- Ler estado externo mutável como o relógio ou uma fonte aleatória.
Por que efeitos colaterais complicam as coisas
Uma função com efeitos colaterais depende do e muda o mundo ao seu redor, então seu comportamento pode variar com contexto oculto. Isso a torna mais difícil de testar (você precisa preparar e verificar o efeito) e mais difícil de raciocinar, já que ordem e ambiente agora importam.
Efeitos colaterais e testes
Lógica pura é fácil de testar; código com efeitos precisa de mocks, fixtures ou recursos reais. Testes que realizam efeitos colaterais reais (acessar um serviço ao vivo, tocar um arquivo compartilhado) são mais lentos e mais propensos à instabilidade em infraestrutura de CI compartilhada.
Gerenciando efeitos colaterais
Uma disciplina comum é isolar efeitos colaterais nas bordas do seu programa e manter a lógica central pura. Dessa forma, a maior parte do código é fácil de testar, e a pequena casca com efeitos é a única parte que precisa de teste de integração mais pesado.
Um exemplo rápido
Uma função que computa um total e o retorna é livre de efeitos; uma que também escreve esse total em um arquivo de log tem um efeito colateral, a escrita do arquivo, que um teste agora precisa considerar.
Efeitos colaterais em CI
Efeitos colaterais descontrolados, arquivos compartilhados, chamadas de rede reais, estado global remanescente, são uma das principais causas de testes dependentes de ordem e instáveis em CI. Isolar efeitos mantém os testes determinísticos. A Latchkey repete automaticamente falhas genuinamente transitórias enquanto você remove a instabilidade guiada por efeitos colaterais.
Principais conclusões
- Um efeito colateral é qualquer mudança observável que uma função faz além de seu valor de retorno.
- Efeitos colaterais realizam o trabalho útil, mas tornam o código mais difícil de testar e raciocinar.
- Efeitos colaterais descontrolados são uma das principais causas de testes de CI instáveis e dependentes de ordem.