Programação Funcional

Por Débora Amorim

A programação funcional é um paradigma de programação, isso significa que ele direciona a forma como nosso código é pensado, estruturado e executado. Uma de suas principais características é que tudo gira em torno de funções. Elas são cidadãos de primeira classe, são tratadas como valores, podendo ser recebidas como parâmetro de uma outra função e/ou serem retornadas.

À primeira vista, este paradigma parece mais difícil de entender porque estamos acostumados a escrever de forma imperativa. Sendo o paradigma funcional declarativo, diferenças cruciais aparecem.

Imperativo x Declarativo

Imagine que seja preciso filtrar funcionários que tiveram afastamento nos últimos 90 dias.

#Paradigma Imperativo:

para cada funcionário

se afastamento verdadeiro

se data afastamento < 90 dias

inclua funcionário

#Paradigma Declarativo:

filtre funcionário afastado nos últimos 90 dias

No paradigma funcional nos preocupamos com o que queremos que seja feito e não em como deve ser feito. Ele permite maior abstração porque as linguagens ditas funcionais implementam laços, variáveis, operações, entre outros trechos de código, nos permitindo utilizá-los. Uma vez entendida a composição de funções, a leitura do código se torna tão simples como em outros paradigmas.

Características fundamentais da programação funcional

 Funções puras: o valor retornado depende unicamente dos parâmetros recebidos e nada fora do escopo da função é alterado. Sendo funções determinísticas, são mais fáceis de testar.

 First Class Function: Uma linguagem de programação só pode ser considerada funcional se tratar suas funções como first-class citizen, ou seja, funções são objetos  / entidades / valores.

 Imutabilidade: A utilização do conceito de imutabilidade permite maior controle do que acontece em seu código e previne que sejam redefinidos valores para variáveis que não poderiam ser alteradas. 

 Higher Order Functions (funções de alta ordem): são funções que operam outras funções, ou seja, podem receber funções como entrada ou retornar funções como saída. Exemplos muito comuns dessas funções são map, filter e reduce, presentes em várias linguagens que suportam programação funcional. É o conceito chave para conceitos mais complexos, como: closure, currying, promises…

 Composição de funções: É um dos pontos mais fortes da programação funcional. Por meio dela montamos as funções como se fossem Lego®, o que permite resolver um problema complexo por meio de algumas funções que desempenham um papel único. Quando combinadas, essas funções resolvem o problema com maior segurança.

Linguagens Funcionais

 Algumas linguagens são puramente funcionais, como por exemplo:

  • Haskell
  • LISP

 Contudo é possível que linguagens que adotam outros paradigmas, como a orientação a objetos, também adotem o paradigma funcional, porque esses paradigmas tratam de aspectos diferentes. Então há linguagens que mesmo não sendo conhecidas como funcionais, dão suporte à uma implementação funcional. É o que acontece com:

  • Python
  • JavaScript

Diferenciais do paradigma

 As características do paradigma funcional trazem algumas vantagens para as linguagens que os implementam:

  • Código extremamente modular;
  • Funções testadas mais facilmente;
  • Código imutável, portanto, mais seguro;

 O paradigma funcional nos ajuda a abordar problemas complexos quebrando o mesmo em questões menores, mais simples de serem resolvidas com a implementação de funções genéricas, que podem ser reutilizadas em outros momentos.

 Contudo, nem sempre é possível manter o código estritamente funcional. Há cenários onde funções puras não são aplicáveis.

 Então o melhor a se fazer é estudar a necessidade de cada implementação e lançar mão das ferramentas disponíveis.