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

Refatoração e Code Smells - Guru-SP

Refatoração e Code Smells - Guru-SP

Apresentação feita no 55º encontro do Guru-SP.

André Benjamim

August 31, 2019
Tweet

More Decks by André Benjamim

Other Decks in Programming

Transcript

  1. 3

  2. 4

  3. 5

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

    ◦ Flexibilidade ◦ Escalabilidade ◦ Manutenibilidade • SOLID • Refatoração, Code Smells e Design Patterns • Arquitetura 6
  5. Do design ao código limpo 7 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
  6. “ Refactoring is a disciplined technique for restructuring an existing

    body of code, altering its internal structure without changing its external behavior. 9 – Martin Fowler
  7. 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 11
  8. Quando refatorar? Situações mais comuns para refatorar: Regra de três

    Quando adicionar uma feature Quando corrigir um bug Durante o code review 13
  9. 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 14
  10. 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! 16
  11. 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. 17
  12. 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. 20 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.
  13. 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 23
  14. 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 24
  15. 26

  16. 27

  17. 29

  18. 30

  19. 31

  20. 33

  21. 34

  22. 35

  23. 36

  24. 37

  25. 38

  26. 39

  27. 41

  28. 42

  29. 43

  30. 44

  31. 45

  32. 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 48
  33. 50

  34. 51

  35. 52

  36. 53

  37. 55

  38. 56

  39. 57

  40. 58

  41. 59

  42. 60

  43. 61

  44. 63

  45. 64

  46. 65

  47. 66

  48. 67

  49. 68

  50. 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 70
  51. 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 71
  52. 73

  53. 74

  54. 75

  55. 76

  56. 77

  57. 79

  58. 80

  59. 81

  60. 83

  61. 84

  62. 85

  63. 86

  64. 87

  65. 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 89
  66. Soluções • Extract Class para converter em um objeto •

    Introduce Parameter Object ou Preserve Whole Object para ajustar a assinatura de métodos 90
  67. 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 92
  68. 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 93
  69. 95

  70. 96

  71. 97

  72. 98

  73. 99

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

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

    mudança para apenas uma classe 103
  76. 105

  77. 106

  78. 107

  79. 108

  80. 109

  81. 110

  82. 111

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

    Quando uma classe é alterada por diversos motivos • A classe possui mais de uma responsabilidade 114
  84. 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 118
  85. 119

  86. 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 120
  87. Inappropriate Intimacy Esse code smell apresenta o seguinte sintoma: •

    Classes que conhecem métodos e campos internos de outra classe 122
  88. 123

  89. 124

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

    ou Move Method para mover as partes que são utilizadas 125
  91. Temporary Field Esse code smell apresenta o seguinte sintoma: •

    Variável que só é atribuído valor em certos cenários 128
  92. 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 129
  93. 131

  94. 132

  95. 133

  96. 134

  97. 135

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

    Subclasses utilizam apenas alguns métodos • Subclasses recusam-se a implementar a interface que herdaram 137
  99. 140

  100. 141

  101. 142

  102. 143

  103. Quero saber mais • Refactoring: Improving the Design of Existing

    Code • Refactoring: Ruby Edition • Ruby Science • Practical Object-Oriented Design in Ruby • 99 Bottles of OOP 146
  104. 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) 147
  105. Quero saber mais • Therapeutic Refactoring - Katrina Owen (Cascadia

    Ruby Conf 2012) • Polly want a message - Sandi Metz • All The Little Things - Sandi Metz • Software Design in the 21st Century - Martin Fowler • Refatoração: um pouco além do código - Edmilton Neves (Guru-SP) 148