$30 off During Our Annual Pro Sale. View Details »

Programação funcional que funciona

Programação funcional que funciona

Introdução a programação funcional e demonstrações práticas e reais de todos os conceitos em Ruby.

Por que FP (functional programming) importa?

Seus softwares terão menos bugs, serão mais rápidos de se desenvolver e mais fáceis de se manter.

Em outras palavras: +Dinheiro +Qualidade de vida +Sanidade.

Temas abordados:

1. Conceitos: Pure/Stateless functions, Composition, High order functions, Recursion, Referential transparency.

2. Ruby Functional Objects.

3. Como a comunidade Ruby já está sendo positivamente afetada.

Rodrigo Serradura

November 25, 2017
Tweet

More Decks by Rodrigo Serradura

Other Decks in Programming

Transcript

  1. programação funcional
    que funciona

    View Slide

  2. Talk is
    cheap.
    Show me the
    code.
    Linus Torvalds

    View Slide

  3. View Slide

  4. https://github.com/serradura/request_via

    View Slide

  5. View Slide

  6. + concorrente

    View Slide

  7. + concorrente
    + consumo de memória

    View Slide

  8. Um código melhor de:
    desenvolver,
    manter e
    evoluir.

    View Slide

  9. View Slide

  10. Tudo que usa blocos poderá ser
    melhorado com o uso de
    funções (aka: lambdas). Ex:
    ● Active Admin
    ● Concurrent Ruby

    View Slide

  11. Objetivos

    View Slide

  12. Porque
    programação
    funcional se
    tornou relevante
    para mim e
    deveria se tornar
    relevante para
    você.

    View Slide

  13. Porque
    programação
    funcional é
    relevante para o
    ecossistema Ruby.
    Porque
    programação
    funcional se
    tornou relevante
    para mim e
    deveria se tornar
    relevante para
    você.

    View Slide

  14. Como se tornou relevante para
    mim?

    View Slide

  15. Resposta rápida:

    View Slide

  16. Resposta não tão rápida...

    View Slide

  17. if hurts, do it more
    often.
    Martin Fowler

    View Slide

  18. Junho / 2017

    View Slide

  19. Me coloquei à
    disposição para
    organizar o
    próximo Meetup
    23/06.
    3 Hello Worlds
    em Elm.
    22/06
    Junho / 2017
    Entrei para
    comunidade
    Elm via
    ElmBrasil no
    Telegram
    20/06.
    Roadmap do
    Elm, como Evan
    Czaplicki
    prioriza os
    próximos.
    (Simplicidade)
    24/06
    Primeiros reflexos:
    Criei uma abstração
    compondo funções
    para gerenciar o ciclo
    de vida do JS no
    Turbolinks.
    28/06.

    View Slide

  20. Junho / 2017
    Me coloquei à
    disposição para
    organizar o
    próximo Meetup
    20/06.
    3 Hello Worlds
    em Elm.
    22/06
    Entrei para
    comunidade
    Elm via
    ElmBrasil no
    Telegram
    20/06.
    Roadmap do
    Elm, como Evan
    Czaplicki
    prioriza os
    próximos.
    (Simplicidade)
    24/06
    Primeiros reflexos:
    Criei uma abstração
    compondo funções
    para gerenciar o ciclo
    de vida do JS no
    Turbolinks.
    28/06.

    View Slide

  21. Me coloquei à
    disposição para
    organizar o
    próximo Meetup
    23/06.
    3 Hello Worlds
    em Elm.
    22/06
    Entrei para
    comunidade
    Elm via
    ElmBrasil no
    Telegram
    20/06.
    Roadmap do
    Elm, como Evan
    Czaplicki
    prioriza os
    próximos.
    (Simplicidade)
    24/06
    Primeiros reflexos:
    Criei uma abstração
    compondo funções
    para gerenciar o ciclo
    de vida do JS no
    Turbolinks.
    28/06.
    Junho / 2017

    View Slide

  22. Julho / 2017

    View Slide

  23. Implementação
    do Strong
    Parameters
    (Ruby) numa
    abordagem
    funcional.
    10/07.
    Julho / 2017

    View Slide

  24. Implementação
    do Strong
    Parameters
    (Ruby) numa
    abordagem
    funcional.
    10/07.
    Julho / 2017

    View Slide

  25. Implementação
    do Strong
    Parameters
    (Ruby) numa
    abordagem
    funcional.
    10/07.
    Julho / 2017

    View Slide

  26. Abordagem
    /Abstração
    reativa (FRP)
    para orquestrar
    um stream de
    eventos
    28/07.
    Julho / 2017
    Implementação
    do Strong
    Parameters
    (Ruby) numa
    abordagem
    funcional.
    10/07.
    Contribuição
    para
    vue-turbolinks
    com direito a
    variações!
    20/07

    View Slide

  27. Abordagem
    /Abstração
    reativa (FRP)
    para orquestrar
    um stream de
    eventos
    28/07.
    Implementação
    do Strong
    Parameters
    (Ruby) numa
    abordagem
    funcional.
    10/07.
    Contribuição
    para
    vue-turbolinks
    com direito a
    variações!
    20/07
    Julho / 2017

    View Slide

  28. Agosto / 2017

    View Slide

  29. Mandaram eu
    ler o Mostly
    Adequate
    Guide to
    Functional
    Programming
    08/08.
    Agosto / 2017
    Criar o DOM via
    composição de
    funções no estilo
    Elm com jQuery e
    Ramda
    23/08

    View Slide

  30. Mandaram eu
    ler o Mostly
    Adequate
    Guide to
    Functional
    Programming
    08/08.
    Agosto / 2017
    Criar o DOM via
    composição de
    funções no estilo
    Elm com jQuery e
    Ramda
    23/08

    View Slide

  31. Mandaram eu
    ler o Mostly
    Adequate
    Guide to
    Functional
    Programming
    08/08.
    Agosto / 2017
    Criar o DOM via
    composição de
    funções no estilo
    Elm com jQuery e
    Ramda
    23/08
    Benchmark para
    comparar a
    performance do uso de
    Funções VS Métodos
    estáticos e de instância
    em Ruby
    25/08.
    2º ElmSP
    Pagar.me
    28/08

    View Slide

  32. Mandaram eu
    ler o Mostly
    Adequate
    Guide to
    Functional
    Programming
    08/08.
    Agosto / 2017
    Criar o DOM via
    composição de
    funções no estilo
    Elm com jQuery e
    Ramda
    23/08
    Benchmark para
    comparar a
    performance do uso de
    Funções VS Métodos
    estáticos e de instância
    em Ruby
    25/08.
    2º ElmSP
    Pagar.me
    28/08
    Operador de
    composição do
    Elm no Ruby
    30/08.

    View Slide

  33. Mandaram eu
    ler o Mostly
    Adequate
    Guide to
    Functional
    Programming
    08/08.
    Agosto / 2017
    Criar o DOM via
    composição de
    funções no estilo
    Elm com jQuery e
    Ramda
    23/08
    Benchmark para
    comparar a
    performance do uso de
    Funções VS Métodos
    estáticos e de instância
    em Ruby
    25/08.
    2º ElmSP
    Pagar.me
    28/08
    Operador de
    composição do
    Elm no Ruby
    30/08.

    View Slide

  34. Setembro / 2017

    View Slide

  35. You might not need
    #reactjs, or #redux,
    follows an example of
    how you can do
    everything with @jquery
    and ES201*.
    18/09.
    Setembro / 2017

    View Slide

  36. You might not need
    #reactjs, or #redux,
    follows an example of
    how you can do
    everything with @jquery
    and ES201*.
    18/09.
    Setembro / 2017

    View Slide

  37. You might not need
    #reactjs, or #redux,
    follows an example of
    how you can do
    everything with @jquery
    and ES201*.
    18/09.
    Setembro / 2017
    @jodosha (criador do
    Hanami) publica os melhores
    slides sobre Functional
    Objects em Ruby que havia
    visto.
    27/09
    30LOC to implement a
    complete and
    extensible EventBus in a
    FP approach.
    28/09
    3º ElmSP
    TW
    28/09

    View Slide

  38. You might not need
    #reactjs, or #redux,
    follows an example of
    how you can do
    everything with @jquery
    and ES201*.
    18/09.
    Setembro / 2017
    @jodosha (criador do
    Hanami) publica os melhores
    slides sobre Functional
    Objects em Ruby que havia
    visto.
    27/09
    30LOC to implement a
    complete and
    extensible EventBus in a
    FP approach.
    28/09
    3º ElmSP
    TW
    28/09

    View Slide

  39. Outubro / 2017

    View Slide

  40. Video
    Luca Guidi - @jodosha
    Functional web with
    Ruby
    09/10.
    Outubro / 2017
    RequestVia 0.1.0:
    A Functional HTTP Client
    That Wraps Net::HTTP
    30/10.

    View Slide

  41. Video
    Luca Guidi - @jodosha
    Functional web with
    Ruby
    09/10.
    Outubro / 2017
    RequestVia 0.1.0:
    A Functional HTTP Client
    That Wraps Net::HTTP
    30/10.

    View Slide

  42. Novembro / 2017

    View Slide

  43. Novembro / 2017
    Programação funcional -
    Hands on em diferentes
    tecnologias para manjar
    dos paranauê.
    01/11.

    View Slide

  44. Novembro / 2017
    Programação funcional -
    Hands on em diferentes
    tecnologias para manjar
    dos paranauê.
    01/11.
    Unleash new amazing
    possibilities writing Ruby
    functional objects!
    10/11.

    View Slide

  45. Novembro / 2017
    Programação funcional -
    Hands on em diferentes
    tecnologias para manjar
    dos paranauê.
    01/11.
    Unleash new amazing
    possibilities writing Ruby
    functional objects!
    10/11.

    View Slide

  46. Novembro / 2017
    Programação funcional -
    Hands on em diferentes
    tecnologias para manjar
    dos paranauê.
    01/11.
    Unleash new amazing
    possibilities writing Ruby
    functional objects!
    10/11.

    View Slide

  47. Novembro / 2017
    Programação funcional -
    Hands on em diferentes
    tecnologias para manjar
    dos paranauê.
    01/11.
    Unleash new amazing
    possibilities writing Ruby
    functional objects!
    10/11.

    View Slide

  48. Novembro / 2017
    Programação funcional -
    Hands on em diferentes
    tecnologias para manjar
    dos paranauê.
    01/11.
    Unleash new amazing
    possibilities writing Ruby
    functional objects!
    10/11.
    When classes are verbs, they act like functions.
    compound expressions == combination of functions

    View Slide

  49. Novembro / 2017
    Programação funcional -
    Hands on em diferentes
    tecnologias para manjar
    dos paranauê.
    01/11.
    Unleash new amazing
    possibilities writing Ruby
    functional objects!
    10/11.
    When classes are verbs, they act like functions.
    compound expressions == combination of functions

    View Slide

  50. Mindset funcional

    View Slide

  51. Business analysis

    View Slide

  52. Transformação Saída
    Entrada
    Definição formal de um processo

    View Slide

  53. Agile

    View Slide

  54. Funções???

    View Slide

  55. https://en.wikipedia.org/wiki/Function_(mathematics)

    View Slide

  56. View Slide

  57. Princípios de
    programação funcional
    em Ruby.

    View Slide

  58. https://www.ruby-lang.org/en/about/#fn3

    View Slide

  59. View Slide

  60. View Slide

  61. Função de alta ordem
    High-order function

    View Slide

  62. View Slide

  63. View Slide

  64. Função como valores
    First class functions

    View Slide

  65. View Slide

  66. Funções puras
    Pure/Stateless functions

    View Slide

  67. View Slide

  68. Recursão

    View Slide

  69. View Slide

  70. View Slide

  71. Closures

    View Slide

  72. View Slide

  73. Imutabilidade

    View Slide

  74. View Slide

  75. View Slide

  76. View Slide

  77. View Slide

  78. If all the methods are pure functions.
    The objects are data!

    View Slide

  79. View Slide

  80. Functional First Development

    View Slide

  81. First, code
    everything you can
    without using any
    side effects.
    Then, code your
    side effects.
    Functional First Development

    View Slide

  82. http://dry-rb.org/

    View Slide

  83. View Slide

  84. View Slide

  85. View Slide

  86. View Slide

  87. kudos.
    @renanranelli
    @_rchaves_
    @arthurxavierx

    View Slide

  88. @serradura

    View Slide

  89. Obrigado

    View Slide