Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CODECASTS: Talk - Programação Funcional Direto ao Ponto - Vinicius Reis

CODECASTS: Talk - Programação Funcional Direto ao Ponto - Vinicius Reis

Vinicius Reis

December 19, 2016
Tweet

More Decks by Vinicius Reis

Other Decks in Programming

Transcript

  1. Programação Funcional
    Direto ao Ponto
    Principais pontos para começar a usar FP hoje

    View full-size slide

  2. Vinicius Reis
    @vinicius73
    @LuizVinicius73
    Gravo aulas sobre Vue.js, Javascript e Laravel para codecasts.com.br
    Engenheiro de Aplicações @ Decision6

    View full-size slide

  3. Breve História

    View full-size slide

  4. Breve História
    - Veio um antes da Orientação a Objetos (~1950)
    - FP naturalmente gasta mais memória, e memória era muito cara nos anos 50
    - Devido aos custos, a Programação imperativa + OOP se popularizou muito.

    View full-size slide

  5. Por que voltou?

    View full-size slide

  6. Por que voltou?
    - Memórias se tornaram baratas
    - Gasta menos processamento
    - Paralelismo é simples
    - Maiores abstrações, menos bugs

    View full-size slide

  7. Por que voltou?
    Memória não é mais um problema, processamento sim.
    Poder de processamento é algo finito, a única maneira de tornar ele “infinito” é
    com paralelismo.
    OOP é péssimo para paralelismo, pois ele precisa manter o estado dos objetos.
    FP trabalha com imutabilidade, assim processos podem ser feitos em várias
    máquinas com pouco esforço.

    View full-size slide

  8. Quais as linguagens de FP temos hoje?

    View full-size slide

  9. Quais as linguagens de FP temos hoje?
    - Lisp
    - Haskel
    - Rust
    - Elixir
    - Erlang
    - Clojure
    - Scala
    Essa são só algumas das que mais
    chama a atenção.

    View full-size slide

  10. Onde está o JavaScript?

    View full-size slide

  11. Onde está o JavaScript?
    JavaScript não é uma linguagem puramente funcional.
    FP está entre os muitos paradigmas que é possível implementar nele.
    Por não ser “naturalmente funcional” escrever de maneira funcional no
    JavaScript deve partir do desenvolvedor.

    View full-size slide

  12. Princípios
    - Funções de Primeira-classe (First-class Functions)
    - Funções de Primeira-ordem (Higher-order Functions)
    - Funções Puras
    - Imutabilidade

    View full-size slide

  13. Funções de Primeira-classe (First-class Functions)
    Quando uma linguagem permite tratar funções como valores
    - Atribuindo a variáveis
    - Aceitar como argumentos de outras funções
    - Permite retornar funções como resultado de outras funções

    View full-size slide

  14. Funções de Primeira-classe (First-class Functions)

    View full-size slide

  15. Funções de Primeira-classe (First-class Functions)

    View full-size slide

  16. Funções de Primeira-ordem (Higher-order Functions)
    É uma função permite receber ou retornar funções
    (Alguém lembrou de callbacks?)

    View full-size slide

  17. Funções de Primeira-ordem (Higher-order Functions)

    View full-size slide

  18. Funções Puras
    - São funções sem efeitos colaterais (side effects), sejam na memória ou I/O
    - Uma função pura terá sempre o mesmo retorno para a mesma entrada.
    - É muito fácil criar funções com efeitos colaterais, é preciso estar atento.
    - Estão diretamente ligadas a funções matemáticas

    View full-size slide

  19. Funções Puras
    Funções puras conversão diretamente com a imutabilidade.
    Um software feito com funções puras é muito mais fácil de manter, localizar
    bugs e corrigi-los é extremamente simples.
    São exemplos de funções puras:
    - Array.prototype.map
    - Array.prototype.filter
    - Array.prototype.reduce

    View full-size slide

  20. Funções Puras
    IMPURO/MUTÁVEL

    View full-size slide

  21. Funções Puras
    PURO

    View full-size slide

  22. Funções Puras
    PURO

    View full-size slide

  23. Funções Puras
    PURO/MUTÁVEL

    View full-size slide

  24. Imutabilidade
    - Caminha lado-a-lado com as funções puras.
    - Uma variável não muda de valor após sua atribuição
    - Não é algo difícil, apenas exige uma mudança de pensamento
    - Consome mais memória, pois você está trabalhando com cópias não com
    referências.
    - Permite paralelismo
    O conceito de imutabilidade pode parecer controverso e talvez impossível, mas
    é bem simples uma vez que você se propõe a isso.

    View full-size slide

  25. Imutabilidade
    IMPURO/MUTÁVEL

    View full-size slide

  26. Imutabilidade
    PURO/IMUTÁVEL

    View full-size slide

  27. Imutabilidade
    PURO/IMUTÁVEL

    View full-size slide

  28. De volta aos princípios

    View full-size slide

  29. Princípios
    - Funções de Primeira-classe (First-class Functions)
    - Funções de Primeira-ordem (Higher-order Functions)
    - Funções Puras
    - Imutabilidade
    - Recursividade
    - Currying
    - Compose (Function composition)

    View full-size slide

  30. Recursividade
    Quando uma função invoca ela mesma, criando um loop.
    JavaScript possui um limite para a recursividade, cada navegador estabelece um
    número.
    Isso acontece pois o stack de processos fica “cheio” podendo travar a máquina do
    usuário.
    Algumas linguagens implementam tail call optimized, isto já está previsto no
    ES2015+, porém os navegadores ainda não implementaram.

    View full-size slide

  31. Recursividade

    View full-size slide

  32. Recursividade

    View full-size slide

  33. Currying
    Currying é uma técnica que permite:
    “passar argumentos parcialmente para uma função”
    Se uma função precisa de 3 argumentos para ser executada, ao passar um
    argumento para ela, o resultado será uma nova função que aceita dois
    argumentos.
    Esse processo se repete até que todos os argumentos tenham sido passados.

    View full-size slide

  34. Currying
    JavaScript não possui currying por padrão, é preciso o uso de funções de apoio

    View full-size slide

  35. Dados a direita
    É importante observar que muitas vezes (não sempre) em programação
    funcional os dados ficam do direito, como últimos argumentos.
    Se não fosse assim o currying não faria muito sentido.

    View full-size slide

  36. Compose (Function composition)
    Composição de funções é uma técnica que permite criar uma nova função a
    partir da combinação de outras funções
    O resultado de uma função é passado como argumento para a próxima função,
    até que todas as funções tenham sido executadas.
    Também é conhecido como pipe-line de funções

    View full-size slide

  37. Compose (Function composition)
    JavaScript não possui isso por padrão, sem o uso de libs de apoio temos que
    fazer manualmente:

    View full-size slide

  38. Compose (Function composition)
    Usando funções de apoio:

    View full-size slide

  39. São técnicas não regras

    View full-size slide

  40. São técnicas não regras
    Não são todas as linguagens funcionais que implementam essas técnicas ou
    regras.
    Programação funcional acima de tudo é uma metodologia.
    Mesmo em linguagens sem suporte ou com suporte baixo, é possível tirar
    proveito dessas técnicas.

    View full-size slide

  41. São técnicas não regras
    Você não precisa usar tudo isso de uma vez.
    Já ficou claro que você já usa muita coisa de FP sem saber, só precisa começar a
    usar mais, e consciente do uso.
    Com o tempo pode incorporar bibliotecas como o Ramda.js que te ajudam e
    forçam a escrever de maneira totalmente funcional.

    View full-size slide