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

RubyConf Brasil - 2018

RubyConf Brasil - 2018

Apresentação sobre refatoração realizada na RubyConf Brasil em 2018

https://eventos.locaweb.com.br/schedule/6313-2/

Gabriel Pereira

December 14, 2018
Tweet

More Decks by Gabriel Pereira

Other Decks in Programming

Transcript

  1. RUBYCONF BRASIL GABRIEL SILVA PEREIRA ▸ Pai da Maria Luiza;

    ▸ Esposo da Marcella; ▸ Corinthiano; ▸ Consultor e Desenvolvedor de Software na ThoughtWorks em Belo Horizonte. @gabrielpedepera
  2. "A refatoração consiste na mudança do design de um trecho

    de código em pequenas etapas, sem alterar sua funcionalidade, garantindo que o código continue a funcionar após cada etapa.”
  3. Entropia: desordem interna de um sistema, ou ainda, tem a

    ver com a irreversibilidade da ordem.
  4. RUBYCONF BRASIL ENTROPIA EM SISTEMAS COMPUTACIONAIS ▸ Por intervenção: A

    cada intervenção, a entropia do sistema cresce de maneira exponencialmente proporcional à atual entropia do sistema. ▸ Por potencial: A entropia do sistema cresce à medida em que a diferença entre a ordem interna e a ordem externa crescem.
  5. RUBYCONF BRASIL OBJETIVOS DO DESENVOLVEDOR ▸ Entregar funcionalidades; ▸ AGILIDADE:

    valorizar software funcionando; ▸ Resolver problemas.
  6. RUBYCONF BRASIL SENDO ASSIM ▸ A refatoração deve ser uma

    atividade suporte no desenvolvimento;
  7. RUBYCONF BRASIL SENDO ASSIM ▸ A refatoração deve ser uma

    atividade suporte no desenvolvimento; ▸ Precisa ser dosada e aplicada com efetividade;
  8. RUBYCONF BRASIL SENDO ASSIM ▸ A refatoração deve ser uma

    atividade suporte no desenvolvimento; ▸ Precisa ser dosada e aplicada com efetividade; ▸ Analise o código e se pergunte: Se eu tivesse um minuto para refatorar, onde eu o utilizaria?
  9. A code smell is a surface indication that usually corresponds

    to a deeper problem in the system. The term was first coined by Kent Beck while helping me with my Refactoring book. Martin Fowler
  10. RUBYCONF BRASIL ▸ Long Method ▸ Large Class ▸ Primitive

    Obsession ▸ Long Parameter List ▸ DataClumps ▸ Switch Statements ▸ Temporary Field ▸ Refused Bequest ▸ Alternative Classes with Different Interfaces ▸ Divergent Change ▸ Shotgun Surgery ▸ Parallel Inheritance Hierarchies ▸ Lazy class ▸ Data class ▸ Duplicate Code ▸ Dead Code, ▸ Speculative Generality ▸ Feature Envy ▸ Inappropriate Intimacy ▸ Message Chains ▸ Middle Man CODE SMELLS http://mikamantyla.eu/BadCodeSmellsTaxonomy.html THE BLOATERS THE OO ABUSERS THE CHANGE PREVENTERS THE DISPENSABLES THE COUPLERS
  11. RUBYCONF BRASIL MÉTODO LONGO (LONG METHOD) ▸ Extração de Método

    ▸ Introdução de parâmetros ▸ Decomposição de condicional POSSÍVEIS SOLUÇÕES ▸ Fere o princípio de separação das responsabilidades ▸ Diminui o reaproveitamento e a manutenibilidade
  12. RUBYCONF BRASIL CLASSES GRANDES (LARGE CLASS) ▸ Extração de Classes

    ▸ Extração de Subclasses POSSÍVEIS SOLUÇÕES ▸ Muitos métodos e atributos
  13. RUBYCONF BRASIL LISTA DE PARÂMETROS LONGA (LONG PARAMETER LIST) ▸

    Extração de Classes ▸ Extração de Subclasses POSSÍVEIS SOLUÇÕES ▸ São difíceis de entender ▸ Se muito utilizado, o método tende a receber muitos parâmetros vazios ▸ Verificações e variáveis desnecessárias dificultam o entendimento
  14. RUBYCONF BRASIL RENOMEAR UM MÉTODO # method to calculate the

    final price def calculate(price, percent_modifier) if percent_modifier.nil? || percent_modifier < 10 price else price * (percent_modifier / 100) end end it 'calculate the final price with a modifier of 10%' do expect(calculate(100, 10)).to eq(110) end
  15. RUBYCONF BRASIL RENOMEAR UM MÉTODO É SIMPLES! ▸ Muda o

    nome do método ▸ Procura onde é chamado e atualiza
  16. RUBYCONF BRASIL RENOMEAR UM MÉTODO É SIMPLES! ▸ Muda o

    nome do método ▸ Procura onde é chamado e atualiza ▸ Roda os testes
  17. RUBYCONF BRASIL RENOMEAR UM MÉTODO É SIMPLES? ▸ Quem chama

    o método vai quebrar? (conflito de nomes)
  18. RUBYCONF BRASIL RENOMEAR UM MÉTODO É SIMPLES? ▸ Quem chama

    o método vai quebrar? (conflito de nomes) ▸ Mudar o nome do método não vai quebrar outro ponto? (metaprogramação)
  19. RUBYCONF BRASIL RENOMEAR UM MÉTODO É SIMPLES? ▸ Quem chama

    o método vai quebrar? (conflito de nomes) ▸ Mudar o nome do método não vai quebrar outro ponto? (metaprogramação) ▸ Tudo ou nada!
  20. RUBYCONF BRASIL REFATORAÇÃO: RENOMEAR UM MÉTODO # method to calculate

    the final price def calculate(price, percent_modifier) if percent_modifier.nil? || percent_modifier < 10 price else price * (percent_modifier / 100) end end it 'calculate the final price with a modifier of 10%' do expect(calculate(100, 10)).to eq(110) end
  21. RUBYCONF BRASIL REFATORAÇÃO: RENOMEAR UM MÉTODO 1. Declare um método

    com um novo nome, que chama o anterior. def final_price(price, percent_modifier) calculate(price, percent_modifier) end
  22. RUBYCONF BRASIL REFATORAÇÃO: RENOMEAR UM MÉTODO 1. Declare um método

    com um novo nome, que chama o anterior. • Rode os testes def final_price(price, percent_modifier) calculate(price, percent_modifier) end
  23. RUBYCONF BRASIL REFATORAÇÃO: RENOMEAR UM MÉTODO 1. Declare um método

    com um novo nome, que chama o anterior. • Rode os testes def final_price(price, percent_modifier) calculate(price, percent_modifier) end
  24. RUBYCONF BRASIL REFATORAÇÃO: RENOMEAR UM MÉTODO 2. Agora, podemos atualizar

    os testes chamando o novo método. it 'calculate the final price with a modifier of 10%' do expect(final_price(100, 10)).to eq(110) end
  25. RUBYCONF BRASIL REFATORAÇÃO: RENOMEAR UM MÉTODO 2. Agora, podemos atualizar

    os testes chamando o novo método. • Rode os testes it 'calculate the final price with a modifier of 10%' do expect(final_price(100, 10)).to eq(110) end
  26. RUBYCONF BRASIL REFATORAÇÃO: RENOMEAR UM MÉTODO 2. Agora, podemos atualizar

    os testes chamando o novo método. • Rode os testes it 'calculate the final price with a modifier of 10%' do expect(final_price(100, 10)).to eq(110) end
  27. RUBYCONF BRASIL REFATORAÇÃO: RENOMEAR UM MÉTODO 3. Por fim, atualizamos

    o nome do método e apagamos o antigo. # method to calculate the final price def final_price(price, percent_modifier) if percent_modifier.nil? || percent_modifier < 10 price else price * (percent_modifier / 100) end end
  28. RUBYCONF BRASIL REFATORAÇÃO: RENOMEAR UM MÉTODO 3. Por fim, atualizamos

    o nome do método e apagamos o antigo: • Rode os testes # method to calculate the final price def final_price(price, percent_modifier) if percent_modifier.nil? || percent_modifier < 10 price else price * (percent_modifier / 100) end end
  29. RUBYCONF BRASIL REFATORAÇÃO: RENOMEAR UM MÉTODO 3. Por fim, atualizamos

    o nome do método e apagamos o antigo: • Rode os testes # method to calculate the final price def final_price(price, percent_modifier) if percent_modifier.nil? || percent_modifier < 10 price else price * (percent_modifier / 100) end end
  30. RUBYCONF BRASIL REFATORAÇÃO: RENOMEAR UM MÉTODO 3. Por fim, atualizamos

    o nome do método e apagamos o antigo: • Rode os testes def final_price(price, percent_modifier) if percent_modifier.nil? || percent_modifier < 10 price else price * (percent_modifier / 100) end end
  31. RUBYCONF BRASIL ATRITO CULTURAL ▸ É muito comum equipes tem

    o mindset SCP (smallest change possible ou menor alteração possível)
  32. RUBYCONF BRASIL ATRITO ARQUITETURAL ▸ Impacto Desconhecido: Quando percebo que

    não sei qual o impacto que a refatoração tem sobre o funcionamento do sistema. ▸ Impacto Indesejável: Quando percebo que a refatoração tem impacto em algo que eu não quero ou posso mudar.
  33. RUBYCONF BRASIL ATRITO SISTÊMICO ▸ O negócio não muda mais,

    e o sistema já atende ao negócio de forma satisfatória.
  34. RUBYCONF BRASIL ATRITO DE CONHECIMENTO ▸ A equipe não é

    fluente na tecnologia em que está trabalhando.
  35. RUBYCONF BRASIL REVISANDO… ‣ A refatoração é um processo contínuo

    para manter e recuperar a qualidade da nossa aplicação, potencializando a evolução do software. ‣E deve ser parte constante do processo de desenvolvimento, pois permite à equipe continuar o trabalho de evolução com os recursos necessários.
  36. RUBYCONF BRASIL REFERÊNCIAS ▸ https://pt.slideshare.net/devcamp/fbio-lima-santos-desenhando-aplicaes-que- evoluem ▸ https://www.slideshare.net/marcosbrizeno/refatorando-tudo-agile-brazil-2017 ▸ https://www.casadocodigo.com.br/products/livro-refatoracao-ruby

    ▸ http://vschettino.com.br/blog/introducao_refatoracao ▸ http://www.industriallogic.com/wp-content/uploads/2005/09/ smellstorefactorings.pdf ▸ https://martinfowler.com/bliki/CodeSmell.html ▸ http://mikamantyla.eu/BadCodeSmellsTaxonomy.html