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.

--

--