programacao funcional
TRANSCRIPT
Programação funcional
E um pouco de JavaScript
Deivis C. Wingert
/DeivisWingert
/Deivis
“Programação funcional, assim como a orientação a objetos, é uma forma de se pensar em como resolver
problemas”
Hoje
Nuvem
Servidores distribuídos
Programação concorrente
E funcional funciona ?
• A programação funcional ficou por anos fechada ao meio acadêmico devido a complexidade
• Mas a cada dia isso vem mudando mais, as linguagens funcionais como Erlang, Clojure, Haskel, F# entre outras veem sendo cada vez mais utilizadas
• Pode ser utilizada em linguagens multi-paradigma como Scala e JavaScript.
Por que funcional ?
• Por que isso agora ? Se já convivo tanto com a orientação a objetos no JavaScript
• O JavaScript não é nativamente orientado a objetos e nem puramente funcional
Pedras no caminho
• A programação funcional vai parecer uma loucura no começo pois estamos em nossa maioria acostumados a trabalhar com a orientação a objetos.
• Para se criar bons sistemas utilizando JavaScript sobre o paradigma funcional é necessária uma bela curva de aprendizado.
Um pouco de história
O que faz uma linguagem ser funcional?
Funções == objetoImutabilidadeRecursividadeLambdaIndependência de estado
O que faz uma linguagem ser funcional?
• Função é a menor parte de um programa
• Na programação funcional nos preocupamos em dizer a maquina o que queremos fazer e não como iremos fazer.
O que faz uma linguagem ser funcional?
• A execução das expressões é controlada por condições e recursividade e não iterações diretas como ocorre nos paradigmas imperativos.
• Variáveis e estados imutáveis.
Sobre o paradigma
• Funções não dependem do estado do sistema.
• Lambda: de maneira simples, é o conceito de funções recebendo e retornando funções ou resultados das mesmas, conceito oriundo do cálculo Lambda do matemático Alonzo Church.
Vantagens
Modularidade
Menos sujeito a efeitos colaterais
Menor dependência entre módulos
Vantagens
Reusabilidade
Programação concorrente
É matematicamente correto
O JavaScript é funcional ?
• Em parte, pois sua construção permite a utilização tanto de programação funcional quanto de orientação a objetos.
Tipos de funções
Funções anônimas
• São simplesmente funções que não tem um nome definido.
• Sua utilização é bem comum quando temos apenas uma chamada a esta determinada função ou quando a retornamos como parâmetro.
Funções anônimas
Funções auto invocáveis
• São funções que ao serem criadas já executam
• Mantem as suas variáveis com acesso apenas interno, isso inclui funções internas.
• Para disponibilizar algum valor pode-se utilizar o return desta função
Funções auto invocáveis
Closures
- Funções que possuem funções filhas que tem acesso as variáveis do escopo da função pai
- Você pode salvar algum dado dentro de uma função que é apenas acessível à função de retorno , isto é, a função retornada mantém seu ambiente de execução.
- Estão presentes em qualquer linguagem funcional.
Clousures
Funções de primeira classe
- Funções mais simples que podem ser representadas apenas com números.
- São atribuídas a uma variável
- Não e não recebem parâmetros complexos
Funções de primeira classe
Funções de alta ordem
- Funções mais complexas onde pode haver uma ou mais funções internas.
- Podem ter escopo compartilhado.
- Recebem funções e retornam funções
Funções de alta ordem
Funções puras
Funções puras
- Funções onde dado um ou mais parâmetros de entrada a será a mesma para toas as vezes que estes parâmetros forem recebidos.
- Não dependem de variáveis externas, recebem dados e retornam dados.
- Não causa nem um tipo de efeito colateral
Funções puras
Funções puras
Algumas ferramentas
CallbacksMapFilter
ReduceForEach
Algumas ferramentas
• O JavaScript desde sua versão 5.1 de 2011, ECMA-262 passou a implementar, map, filter, reduce e forEach como protótipos de array
Callbacks
• São funções passadas como parâmetro, para que a função que recebeu o call-back a use
• Quem nunca usou uma chamada de Ajax da jQuery ?
Callback
Map- Itera um Array executando uma função de call-back
sobre cada item do Array, retornando uma lista nova, normalmente modificada.
- A função map() recebe dois parâmetros , onde primeiro parâmetro é uma função de call-back.
- E o segundo é opcional, é o valor a ser utilizado como o this no momento da execução da função callback.
Map
- O segundo parâmetro é utilizado para especificar o valor para o escopo da função.
- O mais importante são os parâmetros passados para a função de call-back, o elemento do Array em si, o índice do Array, e todo o Array (contexto)
Map
Filter
- Os parâmetros da função filter são exatamente os mesmos da função .map().
- E como o nome sugere ela filtra alguma coisa em um array.
- O filtro é criado a partir da logica da função de call-back passada como parâmetro.
Filter
Reduce
- Itera um Array da mesma maneira que o map, mas retorna a soma dos resultados da função de call-back recebida.
- Assim como map, reduce recebe dois argumentos. A função de call-back e o argumento opcional para o this.
Reduce
- O primeiro é novamente a função de callback, que será chamada para cada elemento no Array.
- O segundo parâmetro é o initialValue que será utilizado para somar ao próximo valor. Caso não seja informado o primeiro valor do array é o initialValue
Reduce
ForEach
• É uma versão não pura do .map(), que como este recebe uma função de call-back como parâmetro e para esta passa o item corrente, índice e uma referencia ao próprio array.
• Mas diferentemente do map, o forEach não tem um retorno.
ForEach
• Funciona basicamente como um for
Menos importante, mas mesmo assim importantes
• Concat
• Reverse
• Sort
• Everey
• Some
• Flat
Manipulando funções
apply & call
• Os métodos call e apply são muito semelhantes, ambos chamam uma função.
• Diferenciam-se pelos parâmetros recebidos
• Por padrão possuem uma variável interna chamada arguments que recebe os parâmetros passados além do this.
apply & call
apply & call
Biding
• É uma função que como o call, recebe this como primeiro parâmetro e uma sequencia de parâmetros.
• A grande diferença é que o bind retorna uma nova função e não o resultado da chamada como call e apply
Biding
Biding
Fábrica de funções
• São clousures que ajudam a organiza o processo de funções que criam outras funções.
Fábrica de funções
Partial application
• Partial application é o processo de vincular um ou mais valores a um ou mais parâmetros de uma função que retorna outra função que irá aceitar os valores que não foram vinculados ainda.
• Uma maneira bonita de criar funções que recebem parâmetros opcionais
Partial application
Partial application
Partial application
Currying
- Em linhas gerais currying é o processo de transformar uma função com muitos argumentos em uma ou mais funções menores e mais simples.
- Não afeta a função simplificada
Currying
Exemplos
/Deivis/Functional-Programming
Perguntas ?
Obrigado