Ferramentas Javascript em ação
Descubra algumas ferramentas de recuperação JavaScript para elevar o nível do seu jogo de programação. Saiba mais sobre o ESLint, o Prettier e o Husky!
Leia nosso artigo para descobrir o poder da programação funcional no JavaScript. A programação funcional é classificada como um paradigma declarativo onde a descrição do programa é separada dos cálculos.
"Em termos simples, a programação funcional é uma desenvolvimento de software estilo que coloca uma grande ênfase na utilização de funções"
Excertos do livro: Luis Atencio "Programação Funcional em JavaScript. Como melhorar a sua JavaScript programas que utilizam técnicas funcionais"
Programação funcional é classificado como um declarativo paradigma em que a descrição do programa é separada dos cálculos. A ênfase aqui está na utilização de expressões para descrever a lógica do programa. Isto é o oposto de imperativo programação, onde o código é executada passo a passo e indica ao computador, em pormenor, como realizar a tarefa.
Considere um caso em que temos uma matriz de números inteiros e precisamos de elevar cada um deles à segunda potência e depois selecionar apenas os valores que não são pares.
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9];
const resultados = []
for(let i = 0; i < numbers.length; i++) {
const secondPower = Math.pow(numbers[i], 2)
if(secondPower & 1) { // ou % 2 mas as operações sobre bits são mais rápidas
resultados.push(segundaPotência);
}
}
console.log(resultados) // [1, 9, 25, 49, 81]
Quanto ao imperativo a atenção dada aos pormenores de implementação é claramente visível. No ciclo, é possível ver o índice da matriz com base na necessidade de controlar o número de elementos. Devido ao grande número de detalhes no código, é mais difícil concentrar-se no que está a fazer. Vamos nós agora concentram-se no declarativo solução.
const risesToSecondPower = (num) => Math.pow(num, 2)
const isOdd = (num) => num & 1;
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
const results = numbers
.map(risesToSecondPower)
.filter(isOdd);
console.log(resultados) // [1, 9, 25, 49, 81]
Nesta solução, a implementação foi separada da invocação, levando a lógica para funções separadas. Graças a esta solução, podemos concentrar-nos apenas nos nomes das funções que descrevem o que está a acontecer nelas. Além disso, o nível de abstração foi aumentado e a lógica pode agora ser reutilizável. Agora, vamos concentrar-nos na chamada. Não se vêem quaisquer detalhes, apenas uma descrição que nos diz o que este código faz, passo a passo:
mapa(risesToSecondPower) - pega em cada elemento de uma matriz e eleva-o à segunda potência,filtro(isOdd) - filtrar e selecionar elementos ímpares.Programação funcional tem muitas vantagens. Quando se trata de JavaScriptA utilização de funções é natural porque se trata de uma linguagem funcional. Mesmo as classes desta linguagem são "açúcar sintático" e são compostas por funções.
No que diz respeito à legibilidade, na abordagem imperativa, o código torna-se normalmente numa lista com nomes de funções que podem ser lidas sequencialmente sem se aprofundar na sua lógica. Como resultado, não nos concentramos nos detalhes de implementação.
Outra vantagem é manter a convenção dos objectos imutáveis. Graças a esta abordagem, o código torna-se mais seguro porque as referências em JavaScript são muito fortes e é fácil modificar o objeto indesejado.
Na programação funcional, o código é dividido em pequenas funções que podem ser facilmente consideradas como código abstrato reutilizável.
Uma das considerações importantes na programação funcional são as funções puras. Para criar uma função deste tipo, é necessário recordar algumas regras:
// Função de entrada
let counter = 5
...
const multipleCounter = (multiplicador) => {
contador = contador * multiplicador
}
multiplyCounter(2) // -> ? o resultado depende do valor inicial
// Função pura
const multiplyBy = (multiplicador) => (valor) => valor * multiplicador
const multipleByTwo = multiplyBy(2)
const counter = multiplyByTwo(5) // -> 10
A primeira função é imprevisível porque depende de um parâmetro externo que pode mudar. A segunda função é transparente, depende apenas dos parâmetros de entrada, não os modifica e não utiliza variáveis fora do intervalo. É transparente porque depende de parâmetros, não os modifica, não utiliza variáveis fora do intervalo e devolve um novo valor.
