A caixa de ferramentas do JS funcional – Parte 1 (Curry e Partialize)
Essa introdução é uma breve contextualização do contexto pessoal atual no qual escrevo esse post. Pode ser pulada sem prejudicar o entendimento.
Minha história com o javascript começou há alguns anos, ví a linguagem passar por diversas mudanças e eu também passei. Como uma linguagem popular, o javascript ou js para os intimos divide opiniões na comunidade, eu mesmo já amei, odiei e voltei a amar.
Mas voltando para as mudanças, após trabalhar com javascript me aventurei pelo mundo da programação concorrente/paralela e me maravilhei com as goroutines e channels do go(golang) e imagino que alguns me conheçam dessa época. Mas foi um pouco depois que comecei a ver as coisas (na programação) de uma forma levemente diferente.
Tinha ouvido falar de uma linguagem chamada Elixir e de um tal paradigma funcional, resumindo (pq acho que já me perdi nessa introdução) fui atrás de aprender mais sobre isso, tive contato com ELM, trabalhei com Elixir e brinquei um pouco de Clojure.
Porém, todavia, entretanto. Voltei a trabalhar com javascript recentemente e meu objetivo com esse post é apresentar algumas "ferramentas" funcionais que trouxe comigo e que me ajudam a solucionar os problemas do dia-a-dia.
Tentarei abordar de forma prática e apresentar exemplos reais. Bóra!!!
Para quem prefere assistir
Após escrever essa primeira parte do artigo palestrei no 7Masters sobre o tema.
Não vou fazer uma introdução ao tema aqui, pois o objetivo não é esse, mas é muito fácil encontrar posts sobre.
Currying
Vamos lá, vou começar por aqui pois acredito ser um mecanismo naturalmente simples de entender e que pode nos dar diversos benefícios permitindo o reuso de código.
Legal, mas todas as vezes que usarmos chatMessage vamos precisar passar todos esses parâmetros, e se olharmos bem username e room repetem bastante.
Vamos tentar melhorar isso.
Hmm, agora podemos reusar a função chatMessage para criar novas funções como a jsMessages que também é reusável e assim por diante. Mas se quisermos passar todos os parâmetros para a função? Nesse caso precisamos fazer assim:
chatMessage('js')('zeucxb')('Functional js!')
Não está tão legal, seria bem melhor poder chamar a função chatMessage com qualquer quantidade de parâmetros válida e caso ainda falte parâmetros receber de volta uma função que espera os parâmetros restantes para retornar o resultado.
Falei parametro muitas vezes, parece confuso rsrs. Mas não é.
Felizmente as funções do javascript tem um método que faz exatamente isso, você já deve ter usado alguma vez e talvez não saiba dessa funcionalidade.
Vamos melhorar isso com um pouco de abstração :D
Ficou bom, outra forma de resolver isso e ainda mais estilosa é assim:
Conclusão
Essa é a parte 1 de uma série de posts que pretendo fazer sobre as ferramentas do javascript funcional.
Nesse primeiro aprendemos partialize e curry, espero que isso te ajude a resolver problemas no seu dia-a-dia. Até a próxima :)