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

Refatoração e Code Smells

Refatoração e Code Smells

André Benjamim

May 31, 2019
Tweet

More Decks by André Benjamim

Other Decks in Programming

Transcript

  1. Ciclo do código • Resolver um problema • Código Limpo

    ◦ Flexibilidade ◦ Escalabilidade ◦ Manutenibilidade • SOLID • Design Patterns, Refatoração e Code Smells • Arquitetura 3
  2. Do design ao código limpo 4 1 Design Definir a

    solução do problema. Código Escrever a solução como código. Refatoração Melhorar o design através do código. Código limpo Resultado é código legível e flexível. 2 3 4
  3. “ Refactoring is a disciplined technique for restructuring an existing

    body of code, altering its internal structure without changing its external behavior. 6 – Martin Fowler
  4. Por que refatorar? Dentre os benefícios de refatorar, podemos listar:

    Melhora o design da aplicação Facilita o entendimento do código Ajuda a encontrar bugs Desenvolvimento mais rápido 8
  5. Quando refatorar? Situações mais comuns para refatorar: Regra de três

    Quando adicionar uma feature Quando corrigir um bug Durante o code review 10
  6. Regra de três A primeira vez que você fizer algo,

    você faz. Na segunda vez que você fizer algo similar, você reclama, mas faz. Na terceira, você refatora. 11
  7. Quando adicionar uma feature O primeiro motivo, geralmente, é para

    poder entender melhor uma parte do código que precisa ser modificada. 12
  8. Quando adicionar uma feature Outro motivo é quando o design

    não facilita a adição de features 13
  9. Quando corrigir um bug Se existe um bug que precisa

    ser corrigido com urgência, significa que o código não estava claro o suficiente para perceber que havia um bug em primeiro lugar. 14
  10. Durante o code review Validar que o código está claro

    para o time. Aprender outras soluções. 15
  11. Durante o code review Dar oportunidade de melhorar o código

    atual e código de features em progresso. 16
  12. Quando refatorar? Alguns sinais que indicam a hora de refatorar:

    Muitos bugs Olhar constantemente o código Novos membros têm dificuldade de entender Testes são difíceis de escrever Introduzir novas features é custoso Produção quebra mais do que deveria 17
  13. Como se preparar? Antes de codar, avalie esses pontos: Defina

    o que você irá refatorar Verifique a cobertura de testes Verifique quais cenários estão cobertos Entenda a funcionalidade e como ela afeta o sistema (front, back, suporte e cliente) Não altere os testes enquanto refatora! 19
  14. Leia o código Entenda o fluxo da funcionalidade, as principais

    classes que a compõe e faça anotações do que deve ser refatorado. Fazendo anotações rake notes Se precisar, faça comentários no código com TODO, FIXME ou OPTIMIZE para ajudar a rastrear e utilize o comando rake notes. 20
  15. Reek, Flay e Flog Essas ferramentas ajudam com code smells,

    duplicação de código e métricas ABC, respectivamente. Use ferramentas Rubycritic É a combinação das três ferramentas com gráficos, classificação de cada arquivo e code smells em formato HTML. 21
  16. Complexidade Preste atenção no código que levou muito tempo para

    entender. Classes que fazem mais do que o nome diz são um bom indicativo. Investigando o código Código bagunçado Código com duplicação ou que não está no padrão do projeto/time. 22
  17. Tipos de code smells Bloaters Métodos e classes que cresceram

    tanto que são difíceis de lidar. São smells que não são aparentes de início, mas tornam-se uma bola de neve. Couplers Esse smells representa o código que tornam as classes acopladas excessivamente. Além do acoplamento, também há o excesso de delegação. Change Preventers Alterações no código precisam ser feitas em múltiplos lugares, tornando o desenvolvimento custoso. 25 Dispensables São códigos desnecessários que tornam o código mais legível, limpo e fácil de entender quando removidos. Object-Orientation Abusers Aplicações incompletas ou erradas de orientação a objetos.
  18. Long Method Esse code smell apresenta os seguintes sintomas: •

    Você não sabe o que o método faz, ao menos não sem ler algumas vezes • Código muito identado (loops e ifs) • Muitos comentários explicando o que um trecho de código faz 28
  19. Soluções • Extract Method para quebrar o método grande em

    métodos menores • Replace Temp with Query para remover variáveis temporárias • Replace Method with Method Object para variáveis muito acopladas • Decompose Conditional para condicionais 29
  20. 31

  21. 33

  22. 34

  23. 36

  24. 37

  25. 39

  26. 40

  27. Soluções • Replace Parameter with Method para valores que podem

    ser obtidos no objeto • Preserve Whole Object para valores que são obtidos de outro objeto • Introduce Parameter Object para itens sem um objeto 44
  28. 46

  29. 47

  30. 49

  31. 50

  32. 52

  33. 53

  34. Large Class Esse code smell apresenta os seguintes sintomas: •

    Muitas variáveis de instância • Muitos métodos públicos e/ou privados • Mais de uma responsabilidade 55
  35. Soluções • Extract Class para classes com mais de uma

    responsabilidade • Replace Type Code with Polymorphism para classes que verificam o tipo de objeto • Replace Type Code with Strategy para classes que tenham algoritmos diferentes com base no tipo 56
  36. 58

  37. 59

  38. 60

  39. 62

  40. 63

  41. 65

  42. 66

  43. Data Clump Esse code smell apresenta os seguintes sintomas: •

    Conjunto de parâmetros que estão sempre juntos • Aparecem em múltiplas classes • Fazem parte da assinatura de múltiplos métodos 68
  44. Soluções • Extract Class para converter em um objeto •

    Introduce Parameter Object ou Preserve Whole Object para ajustar a assinatura de métodos 69
  45. Primitive Obsession Esse code smell apresenta os seguintes sintomas: •

    Manipulação de Strings • Métodos que usam intervalo de valores, ou obtém o maior/menor valor • Validação ou pequenas lógicas para manipular valores 71
  46. Soluções • Replace Data Value with Object para encapsular o

    comportamento em um objeto • Introduce Parameter Object ou Preserve Whole Object se os campos são usados como parâmetros 72
  47. 74

  48. 75

  49. Shotgun Surgery Esse code smell apresenta o seguinte sintoma: •

    Qualquer alteração precisa ser feita em múltiplos lugares 78
  50. Soluções • Move Field ou Move Method para extrair a

    mudança para apenas uma classe 79
  51. 81

  52. 82

  53. 84

  54. 85

  55. Divergent Change Esse code smell apresenta os seguintes sintomas: •

    Quando uma classe é alterada por diversos motivos • A classe possui mais de uma responsabilidade 87
  56. Feature Envy Esse code smell apresenta os seguintes sintomas: •

    Métodos que utilizam mais os dados de um objeto do que da própria classe • Métodos que só utilizam os parâmetros passados e nada mais 91
  57. 92

  58. Soluções • Move Field ou Move Method para colocar no

    lugar mais apropriado • Extract Method para remover somente o trecho que possui o smell e depois Move Method 93
  59. Inappropriate Intimacy Esse code smell apresenta o seguinte sintoma: •

    Classes que conhecem métodos e campos internos de outra classe 95
  60. Inappropriate Intimacy Esse code smell apresenta esses sintomas: • Classes

    que conhecem campos e métodos de outras classes 96
  61. 97

  62. Soluções • Extract Class para remover responsabilidades • Move Field

    ou Move Method para mover as partes que são utilizadas 98
  63. Message Chain Esse code smell apresenta o seguinte sintoma: •

    Possuem chamadas encadeadas: a.b.c.d.e 100
  64. Soluções • Extract Method, Move Field ou Move Method para

    acessar o campo, mas somente se o objetivo é manipular o valor final da cadeia. 101
  65. Temporary Field Esse code smell apresenta o seguinte sintoma: •

    Variável que só é atribuído valor em certos cenários 107
  66. Soluções • Introduce Null Object no lugar de condicionais para

    verificar se o campo possui valor • Replace Method with Method Object ou Extract Class para extrair o campo e operações que dependem dele 108
  67. 110

  68. 111

  69. Refused Bequest Esse code smell apresenta os seguintes sintomas: •

    Subclasses utilizam apenas alguns métodos • Subclasses recusam-se a implementar a interface que herdaram 113
  70. 116

  71. 117

  72. Switch Statements Esse code smell apresenta os seguintes sintomas: •

    Uso de Case statements • Múltiplos ifs 119
  73. Soluções • Replace Conditional with Polymorphism ou Replace Type Code

    with Strategy • Introduce Null Object • Extract Method • Decompose Conditional 120
  74. Quero saber mais • Refactoring: Improving the Design of Existing

    Code • Refactoring: Ruby Edition • 99 Bottles of OOP • Practical Object-Oriented Design in Ruby 123
  75. Quero saber mais • Refactoring from Good to Great -

    Ben Orenstein • Get a Whiff of This - Sandi Metz • Workflows of Refactoring - Martin Fowler • Refactoring Live: Primitive Obsession - James Dabbs (RailsConf 2019 ) • Succession - Katrina Owen (RailsConf 2016) 124
  76. Quero saber mais • Therapeutic Refactoring - Katrina Owen (Cascadia

    Ruby Conf 2012) • Polly want a message - Sandi Metz • All The Little Things - Sandi Metz 125