Olá devs,
Seguindo aqui com a nossa série sobre os conceitos de programação funcional, caso ainda não tenha visto o assunto anterior sobre imutabilidade, clique aqui para ler.
É muito comum ao iniciamos o estudo em uma nova tecnologia nos deparamos com termos que ainda não conhecemos, muitas dessas vezes é necessário entender melhor estes conceitos aprofundando-se no assunto, assim não deixamos lacunas em nosso aprendizado resultando em um embasamento solido no conhecimento adquirido desta nova tecnologia, sendo assim neste artigo vamos entender os termos “funções puras” e “funções impuras” e quais são as suas diferenças.
Então vamos nessa? Let’s Bora!!!
Funções
Antes mesmo de entramos nos termos pura e impura, vamos revisitar um pouco o conceito de função.
Na matemática função é um recurso usado para estabelecer uma relação entre duas variáveis, relacionando elemento de um conjunto A a um elemento de um conjunto B, observe a figura abaixo:
Na figura representada acima podemos observar uma função de A em relação a B (f : A → B ), ou seja, o valor de A gerando o valor de B, sendo que a lei de formação da função é (y=x+4) em outras palavras, função é nada mais que, dado um valor X somando quatro resulta no valor Y, exemplo: 5=x+4. Na computação as funções seguem o mesmo conceito citado acima, ou seja, ao receber determinados argumentos (dados) retorna um valor (resultado).
O que são funções puras e funções impuras?
Funções impuras nem sempre retornam o valor esperado, isso acontece quando a função contém variáveis mutáveis, permitindo assim que o estado dessas variáveis recebam atualizações a qualquer momento, por este motivo podem causar efeitos colaterais (side effects). Observe o código:
Neste código temos a implementação de uma função chamada somaDois(x) onde recebe como argumento um número que sera somado com o valor 2, na linha 8 podemos observar a chamada desta função passando como argumento o número 4 e o retorno desta função será 6, já que é o valor esperado da somatória (4 + 2).
Na linha 5 estar implementado outra função chamada mudarValor() que altera o estado da variável y de 2 para 5, se realizamos a chamada novamente da função somaDois(x) como o mesmo numero passado como argumento, porém executado logo após a chamada da função mudarValor(), não teremos o mesmo resultado esperado (6), já que o estado da variável y foi alterado de 2 para 5, portando a função somaDois(x) é uma função impura, já que o resultado esperado nunca será o mesmo quando o estado da variável y for modificado, este tipo de efeito colateral se aplicado em aplicações pode gerar bugs e dificultar testes e futuras manutenções.
Agora observe o seguinte código:
Já este código escrito em Elixir, contém a implementação da função soma(y, x), esta função sempre ira retornar o valor esperado conforme os seus argumentos o funcionamento é semelhante às funções matemáticas, ou seja, sempre gera os mesmos resultados com os mesmos argumentos, algumas características que as funções puras possuem são:
- Transparência referencial (Referential transparency): O Valor de retorno depende exclusivamente do argumento de entrada.
- Idempotente (Idempotence): Se ao reaplicá-la ao próprio resultado não gera um resultado diferente. Exemplo: f(f(x)) = f(x) . Vale ressaltar que Idempotência é a chave para usar microserviços corretamente.
- Avaliação preguiçosa (Lazy evaluation): Atrasar a avaliação de uma expressão até que o valor seja requerido.
A utilização da abordagem pura é sempre incentivada, pois traz vantagens considerais como: fácil manutenção e maior testabilidade, porém quando houver casos em que a abordagem impura não pode ser evitada, vale considera a utilização de conceitos como a “Segregação de Mutabilidade” que mencionei no artigo anterior.
Funções são pilares importantes no paradigma funcional, por este motivo entender como elas funcionam e quais são suas características são imprescindíveis para quem esta estudando este paradigma, por esta assa razão nos próximos artigos abordaremos mais sobre este tema, onde iremos falar de conceitos como: Funções de Ordem Maior (HOF) e Composição de funções.
Para encerrar deixo aqui uma citação retirada do livro de José Augusto Navarro Garcia Manzano o “Algorítimos Funcionas”.
“ A principal estrutura de dados usada no paradigma funcional é sem sombra de dúvida a função, pois é a partir dessa estrutura que toda a mágica acontece.”
Grande abraço e até a próxima.