5.2 Efeitos Colaterais
Em paradigmas que possuem o conceito de estado do programa, como o procedimental e orientado a objetos, se a avaliação de uma função ou expressão gera uma mudança de estado no programa sem ser decorrente do valor retornado pela função, é dito que a função causa efeitos colaterais (side-effect) . O efeito colateral mais comum é uma atribuição a uma variável global. Na presença de efeitos colaterais, o comportamento de uma função pode depender da sua ordem de execução no programa, uma vez que alguma outra expressão ou função pode modificar o valor de alguma variável que está faz uso. Compreender uma função com efeitos colaterais requer conhecimento sobre o contexto em que ela está sendo executada, bem como conhecer bem as possíveis relações desta com o “mundo exterior”.
Imagine que dentro do escopo ao qual a função square foi definida, existe uma variável que representa a quantidade de vezes que precisamos calcular o quadrado de um número, e que dentro da função square, somamos um nessa variável “global”. A função square, portanto passa a ter efeitos colaterais uma vez que altera o estado do programa sem ser pelo seu retorno, contudo, ela não deixa de ter transparência referencial, pois o retorno ainda depende apenas do parâmetro de entrada.
O Exemplo 38 ilustra esse cenário; contudo, como Haskell é uma linguagem puramente funcional e não há o conceito de estado do programa, o código foi escrito em JavaScript.
Exemplo 38:
var quadradosCalculados = 0;
functionsquare(x)
{
quadradosCalculados = quadradosCalculados + 1;
return x * x;
}
Agora imagine que temos uma outra função f que retorna o número de quadradosCalculados até o momento, obviamente o retorno dessa função depende da sua ordem execução no programa. Por exemplo, se chamarmos f antes de executar square, f retornará 0, e se executarmos imediatamente depois retornará 1, e assim por diante. Sendo assim, f também possui efeitos colaterais e não tem transparência referencial.