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

u-case: Casos de uso em Ruby. Entenda na prática o poder do railway oriented programming - Rodrigo Serradura

u-case: Casos de uso em Ruby. Entenda na prática o poder do railway oriented programming - Rodrigo Serradura

Gravação: https://youtu.be/rtyZ8K58MbU?t=6830

Código produzido no live coding: https://github.com/serradura/railway_oriented_programming_em_ruby

Referências:

1. Introdução a gem u-case
https://serradura.github.io/pt-BR/blog/introducao-gem-u-case/

2. README pt-BR da u-case
https://github.com/serradura/u-case/blob/main/README.pt-BR.md

3. De service objects a use cases
https://www.youtube.com/watch?v=ySNzVfmYy5

4. Entender para atender - Métodos que potencializam equipes de desenvolvimento
https://www.youtube.com/watch?v=HiOhgO2loKQ

Rodrigo Serradura

November 25, 2020
Tweet

More Decks by Rodrigo Serradura

Other Decks in Programming

Transcript

  1. Casos de uso em Ruby
    Entenda na prática o poder do railway oriented
    programming com u-case
    Photo by Sunyu Kim on Unsplash

    View full-size slide

  2. Agenda
    - A estória que levou ao u-case
    - Railway Oriented Programming em Ruby
    - Aplicando u-case na prática numa aplicação
    Rails

    View full-size slide

  3. A estória que levou ao u-case

    View full-size slide

  4. Minha história

    View full-size slide

  5. Minha história
    2006-2010
    Analista de negócios (planilheiro, desenhista de diagramas, mapeador
    de processos...)

    View full-size slide

  6. O que é um processo?

    View full-size slide

  7. https://www.youtube.com/watch?v=w95z9XHSAqc

    View full-size slide

  8. https://www.youtube.com/watch?v=w95z9XHSAqc

    View full-size slide

  9. Processo:
    Uma sequência de ações/etapas
    para atingir um resultado.

    View full-size slide

  10. https://www.tjpr.jus.br/tecnologia-da-informacao?p_p_id=36&p_p_lifecycle=0&p_p_state=maximized&p_p_mode=view&_36_struts_action=%2F
    wiki%2Fview&p_r_p_185834411_nodeName=Governan%C3%A7a-TIC&p_r_p_185834411_title=sobre+Processo+de+TI&p_r_p_185834411_no
    deId=6228681

    View full-size slide

  11. O que é um caso de uso?

    View full-size slide

  12. Caso de uso:
    É uma descrição de como uma pessoa
    usa um processo ou sistema
    para alcançar um objetivo (resultado).

    View full-size slide

  13. Ator Cozinheiro
    Sistema / Processo
    1. Obter ovos, azeite, frigideira, espátula, prato e um
    fogão.
    2. Quebrar os ovos em um recipiente.
    3. Acender uma das bocas do fogão.
    4. Colocar a frigideira na boca acesa do fogão.
    5. Adicionar um pouco de azeite na frigideira.
    6. Adicionar os ovos da tigela na frigideira.
    7. Soltar os ovos da frigideira após estarem fritos com
    a espátula.
    8. Mover os ovos fritos para o prato com a espátula.
    Resultado Ovos fritos pronto para comer

    View full-size slide

  14. Ator Cozinheiro
    Sistema / Processo
    1. Obter ovos, azeite, frigideira, espátula, prato e um
    fogão.
    2. Quebrar os ovos em um recipiente.
    3. Acender uma das bocas do fogão.
    4. Colocar a frigideira na boca acesa do fogão.
    5. Adicionar um pouco de azeite na frigideira.
    6. Adicionar os ovos da tigela na frigideira.
    7. Soltar os ovos da frigideira após estarem fritos com
    a espátula.
    8. Mover os ovos fritos para o prato com a espátula.
    Resultado Ovos fritos pronto para comer

    View full-size slide

  15. Criar pedido
    Dados:
    customer_id, shipment_destination, payment_info,
    customer_contact_info, shipment_mechanism
    Fluxo de sucesso:
    1. Balconista cria pedido com os dados acima.
    2. Sistema valida todos os dados.
    3. Sistema cria um pedido com um determinado order_id.
    4. Sistema entrega o order_id ao balconista.
    Fluxo de falha: Erros de Validação
    3. Sistema entrega mensagens de erro ao balconista.

    View full-size slide

  16. Criar pedido
    Dados:
    customer_id, shipment_destination, payment_info,
    customer_contact_info, shipment_mechanism
    Fluxo de sucesso:
    1. Balconista cria pedido com os dados acima.
    2. Sistema valida todos os dados.
    3. Sistema cria um pedido com um determinado order_id.
    4. Sistema entrega o order_id ao balconista.
    Fluxo de falha: Erros de Validação
    3. Sistema entrega mensagens de erro ao balconista.
    Processo:
    Uma sequência de ações/etapas para atingir um
    resultado.

    View full-size slide

  17. Casos de uso == Processos
    https://study.com/academy/lesson/what-is-a-use-case-definition-examples.html

    View full-size slide

  18. 2010-2017
    Dev Ruby "Normal"
    Minha história

    View full-size slide

  19. Minha história
    2010-2017
    Dev Ruby "Normal"
    2011-2012
    SOLID

    View full-size slide

  20. Minha história
    2010-2017
    Dev Ruby "Normal"
    2011-2012
    SOLID
    2012-2016
    Service objects (Railscast), interactor (gem), trailblazer (gem)

    View full-size slide

  21. 2017
    Minha história

    View full-size slide

  22. 2017
    Minha história
    https://elm-lang.org/

    View full-size slide

  23. O que é uma função?

    View full-size slide

  24. O que é uma função?
    É o mapeamento de uma entrada para uma saída.

    View full-size slide

  25. O que é uma função?
    É o mapeamento de uma entrada para uma saída.

    View full-size slide

  26. O que é uma função?
    É o mapeamento de uma entrada para uma saída.
    Exemplo:
    f(x) = x + 1

    View full-size slide

  27. O que é uma função?
    É o mapeamento de uma entrada para uma saída.
    Exemplo:
    f(x) = x + 1
    f(2) == 3

    View full-size slide

  28. https://dry-rb.org/gems/dry-transaction/0.13/

    View full-size slide

  29. https://dry-rb.org/gems/dry-transaction/0.13/

    View full-size slide

  30. https://dry-rb.org/gems/dry-transaction/0.13/

    View full-size slide

  31. https://fsharpforfunandprofit.com/rop/

    View full-size slide

  32. https://fsharpforfunandprofit.com/rop/

    View full-size slide

  33. https://fsharpforfunandprofit.com/rop/

    View full-size slide

  34. https://fsharpforfunandprofit.com/rop/

    View full-size slide

  35. https://fsharpforfunandprofit.com/rop/

    View full-size slide

  36. 2017-2019
    Minha história

    View full-size slide

  37. "Most of the biggest problems in
    software are problems of
    misconception.
    — Rich Hickey
    (Criador da linguagem Clojure)

    View full-size slide

  38. λ O poder do Functional
    First Development

    View full-size slide

  39. "So much complexity in software
    comes from trying to
    make one thing do two things."
    — Ryan Singer

    View full-size slide

  40. Functional First Development

    View full-size slide

  41. First, code
    everything you can
    without using any
    side effects.
    Functional First Development

    View full-size slide

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

    View full-size slide

  43. 2019-2020
    Minha história

    View full-size slide

  44. Kind,
    Micro::Attributes,
    Micro::Case,
    Micro::Observers

    View full-size slide

  45. kind
    Type System (at runtime) / Monads
    u-case
    u-attributes
    u-observers

    View full-size slide

  46. kind
    Immutable/Value objects
    u-case
    u-attributes
    u-observers

    View full-size slide

  47. kind
    Functional Objects / Use Cases
    u-case
    u-attributes
    u-observers

    View full-size slide

  48. kind
    Observer pattern / pub/sub
    u-observers
    u-attributes
    u-case

    View full-size slide

  49. Demo
    Photo by Denis Pavlovic on Unsplash

    View full-size slide

  50. Kaizen Driven Development

    View full-size slide

  51. Kaizen Driven Development

    View full-size slide

  52. 1. Comece com um bloco procedural enorme (vulgo
    tripa) em uma classe que herde de Micro::Case.
    2. Crie um flow interno com then + métodos privados.
    3. Repetição está clara? Isole os steps em cases e
    faça composição com then. Ex: then(MyCase).
    4. Exitem flows bem definidos? Que tal compor eles
    como flows estáticos?
    Kaizen Driven Development

    View full-size slide

  53. ● Introdução a gem u-case
    https://serradura.github.io/pt-BR/blog/introducao-gem-u-case/
    ● README pt-BR da u-case
    https://github.com/serradura/u-case/blob/main/README.pt-BR.md
    ● Dez/2019 - De service objects a use cases
    https://www.youtube.com/watch?v=ySNzVfmYy5
    ● Fev/2020 - Entender para atender - Métodos que potencializam equipes de
    desenvolvimento
    https://www.youtube.com/watch?v=HiOhgO2loKQ
    Referências

    View full-size slide

  54. https://serradura.github.io/pt-BR/

    View full-size slide