#2 - Programação Funcional - Funções de Primeira Classe e Funções de Ordem Superior
Funções de Primeira Classe - First Class Function
Programação Funcional é um paradigma de programação que permite utilizar recursos oriundos da matemática e trabalhar com sistemas escaláveis e que evitam efeitos colaterais, muitas linguagens de programação são totalmente funcionais ou multiparadigma. Esta série mostra como utilizar os conceitos da Programação Funcional no JavaScript
Antes de prosseguir, talvez considere ler o primeiro artigo da série que trata sobre o conceito da PF e nos prepara para esta série, no artigo de hoje iremos explanar tecnicamente Funções de Primeira Classe:
- https://bit.ly/3ecrRZk - Programação Funcional - Tudo o Que Você Precisa Saber! Artigo 1 de 10
O que são Funções de Primeira Classe
Um dos recursos da programação funcional presentes no JavaScript são as Funções de Primeira Classe, isso é possível por que em JavaScript funções também são tratadas como Objetos de Primeira Classe, isso significa que podemos tratar funções como valores, e armazená-las em variáveis e constantes, passar funções como parâmetros em outras funções e até ter funções como retorno de outras funções. Isso abre um leque de possibilidades em vários Padrões de projetos (Design Patterns), tais como Funções de Ordem Superior (High Order Functions), callback entre outros recursos, e se torna indispensável quando trabalhamos com bibliotecas que utilizam o paradigma da programação Funcional como Lodash, RamdaJS ou mesmo React.
Armazenando como valores em variáveis e constantes
Um dos recursos da função de primeira classe, também conhecida como cidadão de primeira classe, é o recurso que permite armazenar a função como valor de uma constante ou variável, no JavaScript as funções já são objetos como outros tipos de dados.
No exemplo abaixo criamos a função cl uma abreviação para console.log, posteriormente atribuímos a constante escreve com a função cl, a partir desse momento, podemos chamar a constante escreve como uma função de primeira classe.
function cl(x) {
console.log('console:' + x);
}
const escreve = cl;
escreve('Função como valor de uma constante');
Função de Ordem Superior - High Order Function
Passando uma função como parâmetro de outra função
Passar uma função como parâmetro permite criar funções de ordem superior, no exemplo abaixo, a função retorna, recebe uma função como parâmetro, essa função pode executar qualquer operação, dentro da função retorna, ela poderia ser chamada em qualquer momento, além de ser retornada como foi no exemplo.
Funções que são passadas como parâmetro permitem reutilizar códigos menores com lógica simples para compor lógicas mais elaboradas, e ainda assim manter o escopo e evitar efeitos colaterais.
function cl(x) {
console.log('console:' + x);
}
const escreve = cl;
escreve('Função como valor de uma constante');
function retorna(fn){
return fn
}
let exibe = retorna(escreve)
exibe('Passando uma função escreve como parâmetro e retornando uma função')
Armazenando funções em uma estrutura de dados
Além de armazenar as funções como valores de uma constante ou variável, também é possível atribuir essa função como um índice de um array, e apontar o índice deste array executando essa função, e até passando parâmetros.
No exemplo abaixo criamos o array acoes armazenando duas funções, mais uma vez o poder das funções de ordem superior, assim é possível chamar a função cl e passar o parâmetro para executar, ou mesmo armazenar a função com a chamada de parâmetro, e em seguida somente referenciá-la como no caso da segunda posição com a função exibe.
. //código anterior
.
.
let acoes = [cl, exibe('\nExibindo: chamando dentro de um array')]
acoes[0]('Exibindo a função cl dentro do array')
acoes[1]
A seguir o código completo, com o trecho acima no final do código.
function cl(x) {
console.log('console:' + x);
}
const escreve = cl;
escreve('Função como valor de uma constante');
function retorna(fn){
return fn
}
let exibe = retorna(escreve)
exibe('Passando uma função escreve como parâmetro e retornando uma função')
let acoes = [cl, exibe('\nExibindo: chamando dentro de um array')]
acoes[0]('Exibindo a função cl dentro do array')
acoes[1]
Já utilizamos funções como passagem de parâmetros inúmeras vezes, como é o caso dos já conhecidos callbacks, também quando passamos Arrow Functions como parâmetros, estamos trabalhando com funções de ordem superior.
No exemplo a seguir vemos o comando setTimeout() que recebe uma função como parâmetro, e um tempo em milissegundos que deve ser respeitado antes de executar o código. neste caso, estamos passando o tempo em segundos como parâmetro, que será convertido em milissegundos.
const timeout = (seg) => setTimeout(() => cl(`Aguardando ${seg}s`), parseInt(seg) * 1000);
timeout(5)
Talvez você já tenha percebido que já utiliza alguns recursos da programação funcional, sem saber que ela pertencia a esse paradigma de programação, mas o grande barato da Programação Funcional é além do uso consciente, o uso em conjunto com outros recursos da Programação Funcional, como a programação declarativa, imutabilidade e muito mais.
No próximo artigo continuaremos aprendendo novos recursos da programação funcional, se você gostou compartilhe com seus amigos este artigo, e lembre-se que temos um Curso Completo de JavaScript sensacional onde abordamos muitos recursos da linguagem em projetos reais, e se você já conhece JavaScript convidamos a conhecer nosso Curso Completo de NodeJS que está imperdível.
A gente se vê no próximo artigo! Até lá!
Glaucio Daniel