Tutorial Phoenix framework

91
Tutorial Phoenix Framework Arthur Braga Alfredo 1

Transcript of Tutorial Phoenix framework

Page 1: Tutorial Phoenix framework

Tutorial

Phoenix Framework

Arthur Braga Alfredo

1

Page 2: Tutorial Phoenix framework

O que será ensinado hoje?

2

Page 3: Tutorial Phoenix framework

1ª parte: Elixir

HistóriaConceitos de programação funcionalPattern MatchingTipos de dadosMódulos e funções nomeadasCondicionaisLoopsMix

3

Page 4: Tutorial Phoenix framework

2ª parte: Phoenix

Criação do projetoEstrutura de arquivosRotas e pipelineControllers, Models, Templates e ViewsEctoGeradoresChannels

4

Page 5: Tutorial Phoenix framework

O que não vou falar

OTPNodesSupervisoresMacrosProtocolos

5

Page 6: Tutorial Phoenix framework

História

6

Page 7: Tutorial Phoenix framework

Teoria da Lógica combinatória - 1927.

Base para o design das linguagens deprogramação funcionais.

Higher-order functions.

As linguagens funcionais Haskell, Brooks,Curry e o conceito currying foramhomenagens a ele.

Haskell Curry

7

Page 8: Tutorial Phoenix framework

Teoria das funções recursivas - 1931.

Considerado um dos mais importanteslógicos que já existiu.

Kurt Gödel

8

Page 9: Tutorial Phoenix framework

Teoria do cálculo lambda - 1936

Funções anônimas

Influenciou o design do LISP e daslinguagens de programação funcionaisem geral.

Conceitos de abstração.

Linguagens de alto nível.

Alonzo Church

9

Page 10: Tutorial Phoenix framework

LISP foi criado no MIT em 1960ISWIM em 1966SASL em 1973Miranda e Erlang em 1986Haskell em 1992

Primeiras Linguagens

10

Page 11: Tutorial Phoenix framework

Quais as vantagens daslinguagens funcionais?

11

Page 12: Tutorial Phoenix framework

Imutabilidade

12

Page 13: Tutorial Phoenix framework

Poucos problemas deconcorrência

13

Page 14: Tutorial Phoenix framework

Mais fácil de testar

14

Page 15: Tutorial Phoenix framework

Menos código = Facilidadede manutenção

15

Page 16: Tutorial Phoenix framework

Porque ficou mais nasuniversidades?

16

Page 17: Tutorial Phoenix framework

Criador da linguagem Fortran - 1950.

Criada dentro da IBM.

Primeira linguagem de alto nível.

Dominou a área de programação.

Continua sendo usada até hoje em super computadores.

.

John W. Backus

17

Page 18: Tutorial Phoenix framework

John W. Backus

Turing award em 1977.

“Linguagens de programação convencionais estão ficando

cada vez maiores, mas não mais fortes.”

18

Page 19: Tutorial Phoenix framework

Memória era muito cara

19

Page 20: Tutorial Phoenix framework

Os computadores era lentos

20

Page 21: Tutorial Phoenix framework

Programação paralelaestava engatinhando

21

Page 22: Tutorial Phoenix framework

Multi-processadores também

22

Page 23: Tutorial Phoenix framework

E Nem se falava em multi-core

23

Page 24: Tutorial Phoenix framework

Mas muita coisa mudou

24

Page 25: Tutorial Phoenix framework

Memória

25

Page 26: Tutorial Phoenix framework

Multi-core

26

Page 27: Tutorial Phoenix framework

Multi-processador

27

Page 28: Tutorial Phoenix framework

Mas tem um porém

28

Page 29: Tutorial Phoenix framework

The free lunch is over

29

Page 30: Tutorial Phoenix framework

Elixir

30

Page 31: Tutorial Phoenix framework

Brasileiro.

Fez parte do core team do rails.

Participou de muitos projetos open source.

Decidiu criar a linguagem Elixir em 2013.

José Valim

31

Page 32: Tutorial Phoenix framework

Objetivo

Criar uma linguagem que que possibilitasse altaperformance, extensibilidade e produtividade e

que rodasse na VM do Erlang.

32

Page 33: Tutorial Phoenix framework

Porque Erlang?

Criado em 1986 para resolver problemas naárea de telefonia.Altamente tolerante a falhas.Altamente concorrente.Fácil de escalar.

33

Page 34: Tutorial Phoenix framework

Porque Erlang?

https://blog.whatsapp.com/196/1-million-is-so-2011

34

Page 35: Tutorial Phoenix framework

Descobriu Elixir em 2013.Desenvolveu uma biblioteca dewebsockets.Viu a oportunidade de criar umframework com foco em produtividadeno estilo do rails.

Chris McCord

35

Page 36: Tutorial Phoenix framework

Timeline

Dezembro de 2013: Início do desenvolvimento do Phoenix.Setembro de 2014: José Valim entra para o Core Team.Agosto de 2015: Lançada versão 1.0

36

Page 37: Tutorial Phoenix framework

O que é programaçãofuncional?

37

Page 38: Tutorial Phoenix framework

É um paradigma de programação que trata acomputação como uma avaliação de funções

matemáticas e que evita estados ou dadosmutáveis

38

Page 39: Tutorial Phoenix framework

Conceitos

39

Page 40: Tutorial Phoenix framework

Imutabilidade

Uma vez que uma variável é criada,seu valor não pode mais ser

alterado.

40

Page 41: Tutorial Phoenix framework

Imutabilidade

Eshell V8.0.3

1> A = 10.102> A = 20. ** exception error: no match of right hand side value 20

41

Page 42: Tutorial Phoenix framework

Imutabilidade

Interactive Elixir (1.3.2)

iex(1)> a = 1010iex(2)> a = 2020

42

Page 43: Tutorial Phoenix framework

Imutável?

43

Page 44: Tutorial Phoenix framework

Single matching

A variável não pode mais serreutilizada.

44

Page 45: Tutorial Phoenix framework

Imutabilidade

Interactive Elixir (1.3.2)

iex(4)> a = 1010iex(5)> ^a = 20** (MatchError) no match of right hand side value: 20

45

Page 46: Tutorial Phoenix framework

Rebinding

O valor na memória continuaimutável, mas a variável pode ser

reutilizada.

46

Page 47: Tutorial Phoenix framework

Imutabilidade

iex(12)> soma = 2525

iex(13)> func_soma = fn -> "A soma é #{ soma }" end#Function<20.52032458/0 in :erl_eval.expr/5>

iex(14)> soma = 100100

iex(17)> func_soma.()"A soma é 25"

47

Page 48: Tutorial Phoenix framework

Funções anônimas

São funções que podem ser tratadascomo valores e que podem ser

manipuladas ou retornadas por outrasfunções.

48

Page 49: Tutorial Phoenix framework

Funções anônimas

soma10 = fn (x) -> x + 10 endsoma10.(20) # => 30

multiplica = fn x,y -> x * y endmultiplica.(10,10) # => 100

lista = [1,2,3,4,5]

Enum.map(lista, soma10) [11, 12, 13, 14, 15, 16]

49

Page 50: Tutorial Phoenix framework

Funções puras

São aquelas que não causamefeitos colaterais, ou seja, não

interagem com recursos externos.

50

Page 51: Tutorial Phoenix framework

Higher-order functions

São funções que recebem ouretornam outras funções.

51

Page 52: Tutorial Phoenix framework

Higher-order functions

lista = [1,2,3,4,5][1, 2, 3, 4, 5]

Enum.map(lista, fn x -> x * x end)[1, 4, 9, 16, 25]

Enum.reduce(lista, 0, fn(x,y) -> x + y end)15

Enum.reduce(lista, 0, &(&1 + &2))15

Enum.filter(lista, fn x -> x > 2 end)[3, 4, 5]

52

Page 53: Tutorial Phoenix framework

Recursão

São funções que chamam elasmesmas.

53

Page 54: Tutorial Phoenix framework

Recursão

defmodule Fatorial do def de(1), do: 1 def de(n) when n > 0 do n * de(n-1) endend

54

Page 55: Tutorial Phoenix framework

Pattern Matching

iex> {a, b, c} = {:hello, "world", 42}{:hello, "world", 42}

iex> a:hello

iex> b"world"

iex> {a, _, c} = {:hello, "world", 42}{:hello, "world", 42}

iex> a:hello

iex> c42

55

Page 56: Tutorial Phoenix framework

Pattern Matching

iex> {a, b, c} = {:hello, "world"}** (MatchError) no match of right hand side value: {:hello, "world"}

56

Page 57: Tutorial Phoenix framework

Pattern Matching

iex> {:ok, result} = {:ok, 13}{:ok, 13}

iex> result13

iex> {:ok, result} = {:error, :oops}** (MatchError) no match of right hand side value: {:error, :oops}

57

Page 58: Tutorial Phoenix framework

Pattern Matching

iex> [head | tail] = [1, 2, 3][1, 2, 3]

iex> head1

iex> tail[2, 3]

58

Page 59: Tutorial Phoenix framework

Pattern Matching

defmodule Math do def sum_list([head | tail], accumulator) do sum_list(tail, head + accumulator) end

def sum_list([], accumulator) do accumulator endend

IO.puts Math.sum_list([1, 2, 3], 0) #=> 6

59

Page 60: Tutorial Phoenix framework

Pattern Matching - Pin operator

iex> x = 11

iex> ^x = 2** (MatchError) no match of right hand side value: 2

iex> {y, ^x} = {2, 1}{2, 1}

iex> y2

iex> {y, ^x} = {2, 2}** (MatchError) no match of right hand side value: {2, 2}

60

Page 61: Tutorial Phoenix framework

Pipe operator ( |> )

Transforma o valor anterior como primeiroargumento da próxima função.

61

Page 62: Tutorial Phoenix framework

Operador Pipe (|>)

foo(bar(baz(new_function(other_function()))))

62

Page 63: Tutorial Phoenix framework

Operador Pipe (|>)

other_function() |> new_function() |> baz() |> bar() |> foo()

"Elixir rocks" |> String.upcase |> String.split["ELIXIR", "ROCKS"]

"elixir" |> String.ends_with?("ixir")true

63

Page 64: Tutorial Phoenix framework

Elixir

64

Page 65: Tutorial Phoenix framework

Tipos de dados

iex> 1 # integeriex> 0x1F # integeriex> 1.0 # floatiex> true # booleaniex> :atom # atom / symboliex> "elixir" # stringiex> 'elixir' # char listiex> [1, 2, 3] # listiex> {1, 2, 3} # tuple

65

Page 66: Tutorial Phoenix framework

Controles de fluxo

66

Page 67: Tutorial Phoenix framework

If

iex> lang = "Elixir""Elixir"...> if lang do...> IO.puts lang...> endElixir:ok

iex> lang = "Phyton" "Phyton"iex> if lang == "Elixir" do ...> IO.puts lang ...> else ...> IO.puts "Não é elixir"...> end Não é elixir:ok

67

Page 68: Tutorial Phoenix framework

Unless

iex> lang = "Elixir""Elixir"...> unless lang do...> IO.puts lang...> endnil:ok

iex> lang = "Phyton" "Phyton"iex> unless lang == "Elixir" do ...> IO.puts lang ...> end Python:ok

68

Page 69: Tutorial Phoenix framework

Cond

iex> cond do...> 2 + 2 == 5 ->...> "Falso"...> 2 * 2 == 3 ->...> "Falso"...> 1 + 1 == 2 ->...> "Verdadeiro"...> true ->...> "Se nada der certo chega aqui"...> end"Verdadeiro"

69

Page 70: Tutorial Phoenix framework

Case

case {1, 2, 3} do {4, 5, 6} -> "Não vai dar match" {1, x, 3} -> "Vai dar match e o x vai receber o valor 2" _ -> "Essa clausula vai dar match em qualquer valor"end

"Vai dar match e o x vai receber o valor 2"

70

Page 71: Tutorial Phoenix framework

Case

case {1, 2, 3} do {4, 5, 6} -> "Não vai dar match" {1, ^x, 3} -> "Vai dar match e o x vai receber o valor 2" _ -> "Essa clausula vai dar match em qualquer valor"end

"Essa clausula vai dar match em qualquer valor"

71

Page 72: Tutorial Phoenix framework

Case

calcular = fn expressao -> case expressao do {:+, num1, num2} -> num1 + num2 {:-, num1, num2} -> num1 - num2 {:*, num1, num2} -> num1 * num2 {:/, num1, num2} -> num1 / num2 endend

calcular.({:+, 2 ,2})4calcular.({:-, 2 ,2})0calcular.({:/, 2 ,0})** (ArithmeticError) bad argument in arithmetic expression :erlang./(2, 0)

72

Page 73: Tutorial Phoenix framework

Módulos e funções

73

Page 74: Tutorial Phoenix framework

Módulos

iex> defmodule Math do...> def sum(a, b) do...> a + b...> end...> end

Math.sum(1,2) #=> 3

74

Page 75: Tutorial Phoenix framework

Funções

defmodule Math do def sum(a, b) do do_sum(a, b) end

defp do_sum(a, b) do a + b endend

IO.puts Math.sum(1, 2) #=> 3IO.puts Math.do_sum(1, 2) #=> ** (UndefinedFunctionError)

75

Page 76: Tutorial Phoenix framework

Funções

defmodule Math do def zero?(0), do: true def zero?(x) when is_integer(x), do: falseend

76

Page 77: Tutorial Phoenix framework

Guard clauses

calcular = fn expressao -> case expressao do {:+, num1, num2} -> num1 + num2 {:-, num1, num2} -> num1 - num2 {:*, num1, num2} -> num1 * num2 {:/, num1, num2} when num2 != 0 -> num1 / num2 {:/, num1, num2} when num2 == 0 -> IO.puts "Não é possível dividir por 0" endend

calcular.({:/, 2, 0})Não é possível dividir por 0:ok

calcular.({:/, 2, 1})2.0

77

Page 78: Tutorial Phoenix framework

Fatorial

defmodule Fatorial do def de(1), do: 1 def de(n) when n > 0 do n * de(n-1) endend

78

Page 79: Tutorial Phoenix framework

Fatorial

defmodule Fatorial do def de(1, acc), do: acc def de(n, acc) when n > 0 do de(n-1, acc * n) endend

79

Page 80: Tutorial Phoenix framework

Tail call optimization

80

Page 81: Tutorial Phoenix framework

Tail call optimization

81

Page 82: Tutorial Phoenix framework

Arquivos ex e exs

.ex: Arquivos que serão compilados.

.exs: Arquivos que serão interpretados.

82

Page 83: Tutorial Phoenix framework

Arquivos ex e exs

Se o arquivo precisar ser muito rápido, use o expois arquivo exs é compilado em tempo deexecução.

Os arquivos de teste normalmente utilizam .exspara não precisar compilar toda vez que os testesrodarem

83

Page 84: Tutorial Phoenix framework

Mix

Fornece ferramentas e utilidades paratrabalhar com Elixir

84

Page 85: Tutorial Phoenix framework

Hex.pm

85

Page 86: Tutorial Phoenix framework

Live coding: Chat com phoenix

86

Page 87: Tutorial Phoenix framework

Onde aprender mais

87

Page 88: Tutorial Phoenix framework

Onde aprender mais

88

Page 89: Tutorial Phoenix framework

Onde aprender mais

#myelixirstatus

89

Page 90: Tutorial Phoenix framework

Onde aprender mais

90

Page 91: Tutorial Phoenix framework

Muito obrigado

91