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

[2020-12-04] RubySummitBR - Desmacarronando código com dry-RB

[2020-12-04] RubySummitBR - Desmacarronando código com dry-RB

Já trabalhou com aquele código legado, super macarronado, que é pior que aqueles postes de fio que estão prestes a dar vários curtos? Pois bem, nessa palestra apresentarei como saímos de um código tão espaguete que era quase impossível de mexer para uma nova versão em que conseguíamos incluir funcionalidades em apenas algumas horas. Usando o dry-transactions, um componente do dry-rb, melhoramos nosso código (sem remover a complexidade), passamos a ter mais domínio do contexto e, de quebra, acabamos mais motivados

Camila Campos

December 04, 2020
Tweet

More Decks by Camila Campos

Other Decks in Programming

Transcript

  1. @camposmilaa Camila Campos Meu propósito de vida é influenciar para

    reduzir desigualdades sócio-culturais dentro de tecnologia, através da educação e do bom humor.
  2. @camposmilaa Software Engineer @ SumUp Rails Girls São Paulo &

    Women Dev Summit & Ruby Summit BR Camila Campos
  3. Agenda Contexto Time, Projeto & Pessoas Entrega Primeira versão do

    projeto Desmacarronação Como foi a refatoração e o uso do DRY-RB 1. 2. 3. Conclusões O que aprendemos com tudo isso 4.
  4. Decisões manuais (feitas por analistas de crédito) Reprovações automáticas (cerca

    de 10% das análises) Codebase de 3 anos (decisões manuais e reprovação automática)
  5. Decisões manuais (feitas por analistas de crédito) Reprovações automáticas (cerca

    de 10% das análises) Codebase de 3 anos (decisões manuais e reprovação automática)
  6. Atrasos (prazo estourado, complicações e muito chão) Decisões manuais (feitas

    por analistas de crédito) Reprovações automáticas (cerca de 10% das análises) Codebase de 3 anos (decisões manuais e reprovação automática)
  7. Time desmotivado • Atrasos e Complicações • Outras demandas •

    Pressão externa e interna • Demais coisas pessoais
  8. Alinhamento com stakeholders Derteminação do time Esboço do fluxo original

    Combinado com PM e liderança Durante esse período todo...
  9. Agregação e transformação de dados Achar entidade A Achar entidade

    B Consultar serviço 2 Transformar dados Consultar serviço 3 Calcular valores X ... Consultar serviço 4 Calcular valores Y
  10. Quebra de histórias Pequenos entregáveis, a maioria testáveis Mão na

    massa 3 meses sem pressão e com motivação Taca-le pau Prova de Conceito Simples, de um a dois dias
  11. Quebra de histórias Pequenos entregáveis, a maioria testáveis Mão na

    massa 3 meses sem pressão e com motivação Taca-le pau Prova de Conceito Simples, de um a dois dias
  12. Quebra de histórias Pequenos entregáveis, a maioria testáveis Mão na

    massa 3 meses sem pressão e com motivação Entrega do refactor Fluxos simultâneos, comp. de resultados e virada de chave Taca-le pau Prova de Conceito Simples, de um a dois dias
  13. Agregar dados de crédito Achar entidade A Achar entidade B

    Consultar serviço 2 Consultar serviço 3 Calcular valores X Consultar serviço 4
  14. Agregar dados de crédito Achar entidade A Achar entidade B

    Consultar serviço 2 Consultar serviço 3 Calcular valores X Consultar serviço 4 transaction
  15. Agregar dados de crédito Achar entidade A Achar entidade B

    Consultar serviço 2 Consultar serviço 3 Calcular valores X Consultar serviço 4 step/operation transaction
  16. Achar entidade A Achar entidade B Agregar dados de crédito

    saída step 1 = entrada step 2 entrada trans. = entrada step 1 saída step. = saída trans.
  17. require "dry/transaction" class AggregateData include Dry::Transaction step :find_entity_a step :consult_service_2

    private def find_entity_a(a_id:) # returns Success(credit_data: data) # or Failure(error) end def consult_service_2(credit_data:);end end
  18. require "dry/transaction" class AggregateData include Dry::Transaction step :find_entity_a step :consult_service_2

    private def find_entity_a(a_id:) # returns Success(credit_data: data) # or Failure(error) end def consult_service_2(credit_data:);end end
  19. require "dry/transaction" class AggregateData include Dry::Transaction step :find_entity_a step :consult_service_2

    private def find_entity_a(a_id:) # returns Success(credit_data: data) # or Failure(error) end def consult_service_2(credit_data:);end end
  20. require "dry/transaction" class AggregateData include Dry::Transaction step :find_entity_a step :consult_service_2

    private def find_entity_a(a_id:) # returns Success(credit_data: data) # or Failure(error) end def consult_service_2(credit_data:);end end
  21. require "dry/transaction" class AggregateData include Dry::Transaction step :find_entity_a step :consult_service_2

    private def find_entity_a(a_id:) # returns Success(credit_data: data) # or Failure(error) end def consult_service_2(credit_data:);end end
  22. class AggregateData include Dry::Transaction step :find_entity_a step :consult_service_2 private def

    find_entity_a(a_id:) entity = repository.find(a_id) return Failure(message: "A not found") unless entity data = build_data_aggregate_with(entity) Success(credit_data: data) end def consult_service_2(credit_data:); end end
  23. class AggregateData include Dry::Transaction step :find_entity_a step :consult_service_2 step :some_step03

    step :some_step04 step :some_step05 step :some_step06 step :some_step07 step :some_step08 step :some_step09 step :some_step10 step :some_step11 step :some_step12 step :some_step13 step :some_step14 step :some_step15 step :some_step16 step :some_step17 step :some_step18 step :some_step19 step :some_step20 step :some_step21 # .... private def find_entity_a(a_id:); end # .... end
  24. class AggregateData include Dry::Transaction step :find_entity_a private def find_entity_a(a_id:) entity

    = repository.find(a_id) return Failure(message: "A not found") unless entity data = build_data_aggregate_with(entity) Success(credit_data: data) end end
  25. class FindEntityA include Dry::Monads[:result] def call(a_id:, **args) entity = RepoInstance.new.find(a_id)

    return Failure(message: "A not found") unless entity data = build_data_aggregate_with(entity) Success(credit_data: data) end end
  26. class FindEntityA include Dry::Monads[:result] def call(a_id:, **args) entity = RepoInstance.new.find(a_id)

    return Failure(message: "A not found") unless entity data = build_data_aggregate_with(entity) Success(credit_data: data) end end
  27. class AggregateData include Dry::Transaction def initialize steps = { find_entity_a:

    FindEntityA.new } super(**steps) end step :find_entity_a end
  28. CREDITS: This presentation template was created by Slidesgo, including icon

    by Flaticon, and infographics & images from Freepik @camposmilaa Valeu! bit.ly/camis-rubysummit2020