Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

Breve História

Slide 4

Slide 4 text

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.

Slide 5

Slide 5 text

Por que voltou?

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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.

Slide 8

Slide 8 text

Quais as linguagens de FP temos hoje?

Slide 9

Slide 9 text

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.

Slide 10

Slide 10 text

Onde está o JavaScript?

Slide 11

Slide 11 text

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.

Slide 12

Slide 12 text

Princípios

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

Funções Puras IMPURO/MUTÁVEL

Slide 22

Slide 22 text

Funções Puras PURO

Slide 23

Slide 23 text

Funções Puras PURO

Slide 24

Slide 24 text

Funções Puras PURO/MUTÁVEL

Slide 25

Slide 25 text

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.

Slide 26

Slide 26 text

Imutabilidade IMPURO/MUTÁVEL

Slide 27

Slide 27 text

Imutabilidade PURO/IMUTÁVEL

Slide 28

Slide 28 text

Imutabilidade PURO/IMUTÁVEL

Slide 29

Slide 29 text

De volta aos princípios

Slide 30

Slide 30 text

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)

Slide 31

Slide 31 text

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.

Slide 32

Slide 32 text

Recursividade

Slide 33

Slide 33 text

Recursividade

Slide 34

Slide 34 text

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.

Slide 35

Slide 35 text

Currying

Slide 36

Slide 36 text

Currying

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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.

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

São técnicas não regras

Slide 43

Slide 43 text

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.

Slide 44

Slide 44 text

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.

Slide 45

Slide 45 text

Obrigado