Slide 1

Slide 1 text

Qualé dessa programação Funcional?

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

Mônadas

Slide 4

Slide 4 text

Mônadas são apenas monoids na categoria dos endofuctores

Slide 5

Slide 5 text

F(idx ) = idF(x) F(g∘ f) = F(g) ∘  F(f), ∀ f : x → y e g : y → z

Slide 6

Slide 6 text

( ͡° ͜ ʖ ͡°)

Slide 7

Slide 7 text

order = Order.new(total: 100) # =>

Slide 8

Slide 8 text

coupon.discount(order) # => 10

Slide 9

Slide 9 text

address.shipping_cost(order) # => 30

Slide 10

Slide 10 text

order.total # => 120

Slide 11

Slide 11 text

address.shipping_cost(order) # => 30

Slide 12

Slide 12 text

order.total # => 150

Slide 13

Slide 13 text

(╯°□°)╯︵ ┻━┻)

Slide 14

Slide 14 text

OBJETOS

Slide 15

Slide 15 text

Estado + Comportamento

Slide 16

Slide 16 text

Estado e Comportamento são características independentes

Slide 17

Slide 17 text

CADASTRO

Slide 18

Slide 18 text

CADASTRO BÁSICO PRO

Slide 19

Slide 19 text

BÁSICO INDIVIDUAL STARTUP PRO HOSTED ON-PREMISE CADASTRO

Slide 20

Slide 20 text

CADASTRO

Slide 21

Slide 21 text

TERMOS

Slide 22

Slide 22 text

PESSOAL TERMOS

Slide 23

Slide 23 text

TERMOS ENDEREÇO PESSOAL

Slide 24

Slide 24 text

PESSOAL PAGAMENTO ENDEREÇO ACESSO

Slide 25

Slide 25 text

Fluxo de Informação

Slide 26

Slide 26 text

ESTADO

Slide 27

Slide 27 text

Dados são apenas dados

Slide 28

Slide 28 text

Números, Strings, Símbolos

Slide 29

Slide 29 text

Listas, Mapas, Conjuntos

Slide 30

Slide 30 text

[{name: "Rubyconf", year: 2014}, {name: "Rubyconf", year: 2015}]

Slide 31

Slide 31 text

{name: "Rubyconf", year: 2015}

Slide 32

Slide 32 text

"Olá Rubyconf 2015!"

Slide 33

Slide 33 text

[:h1, {class: "greetings"}, "Olá Rubyconf 2015!"]

Slide 34

Slide 34 text

Olá Rubyconf 2015!

Slide 35

Slide 35 text

Dados são manipuláveis

Slide 36

Slide 36 text

Dados livres contribuem com a simplicidade

Slide 37

Slide 37 text

COMPORTAMENTO

Slide 38

Slide 38 text

Trabalhamos realizando transformações sobre dados

Slide 39

Slide 39 text

tech-events -> filter (by-year 2015) -> map make—greeting -> map wrap-with-markup -> render-html

Slide 40

Slide 40 text

Usamos funções como unidade básica de abstração

Slide 41

Slide 41 text

def make—greeting (event) let name = get event :name year = get event :year str "Olá " name " " year "!"

Slide 42

Slide 42 text

Funções dizem “o que fazer” e não o “como fazer”

Slide 43

Slide 43 text

result = [] for event in tech_events do result << make_greeting(event) end result

Slide 44

Slide 44 text

tech-events -> map make—greeting

Slide 45

Slide 45 text

map make-greeting tech-events

Slide 46

Slide 46 text

Composição é feita via Funções de Alta Ordem

Slide 47

Slide 47 text

Funções podem ser parâmetros de outras funções

Slide 48

Slide 48 text

map make—greeting tech-events

Slide 49

Slide 49 text

map f collection

Slide 50

Slide 50 text

map f collection filter f collection reduce f collection

Slide 51

Slide 51 text

Funções podem ser produzir novas funções

Slide 52

Slide 52 text

filter (by-year 2015) tech-events

Slide 53

Slide 53 text

def by-year (year) function (event) year == (get event :year)

Slide 54

Slide 54 text

Dá pra eliminar metade do Design Patterns ;-)

Slide 55

Slide 55 text

Factory, Strategy, Observer, Visitor, Command…

Slide 56

Slide 56 text

Objetos pequenos e de propósito único

Slide 57

Slide 57 text

Funções contribuem com a elegância

Slide 58

Slide 58 text

IMUTABILIDADE

Slide 59

Slide 59 text

Mutabilidade causa dependências implícitas

Slide 60

Slide 60 text

order = Order.new(total: 100) # =>

Slide 61

Slide 61 text

coupon.discount(order) address.shipping_cost(order) order.total # => 120

Slide 62

Slide 62 text

address.shipping_cost(order) coupon.discount(order) order.total # => 117

Slide 63

Slide 63 text

address.shipping_cost(order) # $30 coupon.discount(order) # 10% order.total # => 117

Slide 64

Slide 64 text

address.shipping_cost(order) coupon.discount(order) order.total # => 117

Slide 65

Slide 65 text

…além de um escopo praticamente ilimitado

Slide 66

Slide 66 text

order.place!

Slide 67

Slide 67 text

Mutabilidade deve ser isolada

Slide 68

Slide 68 text

Funções puras

Slide 69

Slide 69 text

def make—greeting (event) let name = get event :name year = get event :year str "Olá" name " " year "!"

Slide 70

Slide 70 text

let event = {name: “RC”, year: 2000} greet = make-greeting event assert-eq greet, ”Olá RC 2000!”

Slide 71

Slide 71 text

Valores vs Entidades

Slide 72

Slide 72 text

inc 1 # => 2

Slide 73

Slide 73 text

coupon.discount(order) # => order # =>

Slide 74

Slide 74 text

coupon.discount(order) # => order # =>

Slide 75

Slide 75 text

Estruturas Persistentes

Slide 76

Slide 76 text

a = [1, 2] # => [1, 2] b = push a 3 # => [1, 2, 3] a # => [1, 2]

Slide 77

Slide 77 text

API com semântica mutável porém produz cópias imutáveis

Slide 78

Slide 78 text

Ruby Hamster, Immutable.js

Slide 79

Slide 79 text

Imutabilidade contribui com a compreensão

Slide 80

Slide 80 text

THERE AND BACK AGAIN…

Slide 81

Slide 81 text

OOP não trata sobre objetos e hierarquias

Slide 82

Slide 82 text

–Alan Kay “I thought of objects being like biological cells and/or individual computers on a network, only able to communicate with messages (so messaging came at the very beginning -- it took a while to see how to do messaging in a programming language efficiently enough to be useful).”

Slide 83

Slide 83 text

DB CLIENT APP

Slide 84

Slide 84 text

Lógica de negócio Funcional Organização feita em Objetos

Slide 85

Slide 85 text

DB VIEW MAILER

Slide 86

Slide 86 text

API DOM API

Slide 87

Slide 87 text

Arquitetura Hexagonal

Slide 88

Slide 88 text

Ambiente externo isolado

Slide 89

Slide 89 text

Aplicação 100% testável

Slide 90

Slide 90 text

Hot-swap

Slide 91

Slide 91 text

DB CLIENT APP V1

Slide 92

Slide 92 text

DB CLIENT APP V2

Slide 93

Slide 93 text

DB VIEW MAILER

Slide 94

Slide 94 text

DB VIEW MAILER V3

Slide 95

Slide 95 text

React, Elm, Erlang…

Slide 96

Slide 96 text

MELHORE SEU RUBY

Slide 97

Slide 97 text

Foco em operações pequenas…

Slide 98

Slide 98 text

transformando valores imutáveis…

Slide 99

Slide 99 text

o que facilita a compreensão…

Slide 100

Slide 100 text

e maximiza a testabilidade.

Slide 101

Slide 101 text

Quer emular Haskell? Use Haskell oras :-)

Slide 102

Slide 102 text

Divirta-se

Slide 103

Slide 103 text

seja usando Ruby ou quem sabe…

Slide 104

Slide 104 text

usando Clojure ;-)

Slide 105

Slide 105 text

Andrew Rosa @_andrewhr

Slide 106

Slide 106 text

Obrigado! @_andrewhr