Analisando Complexidade de Código Ruby

  • 3,703 views
Uploaded on

Palestra feita no evento Ruby Masters Conf edição 2011.

Palestra feita no evento Ruby Masters Conf edição 2011.

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
3,703
On Slideshare
0
From Embeds
0
Number of Embeds
2

Actions

Shares
Downloads
24
Comments
0
Likes
3

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Analisando Complexidade de Código Ruby Utilizando Métricas para Encontrar Código que Fede Cássio Marques RubyMasters Conf 2011Saturday, February 26, 2011
  • 2. Cássio Marques • código + comida vegan + livros + skate + música • Taoweb • Lime • http://cassiomarques.wordpress.com • @cassiomarquesSaturday, February 26, 2011
  • 3. Porque analisar o código?Saturday, February 26, 2011
  • 4. http://www.flickr.com/photos/rovingi/312078231/Saturday, February 26, 2011
  • 5. Como analisar o código?Saturday, February 26, 2011
  • 6. EstéticaSaturday, February 26, 2011
  • 7. Dificuldade de ManutençãoSaturday, February 26, 2011
  • 8. ChuteSaturday, February 26, 2011
  • 9. AbstraçõesSaturday, February 26, 2011
  • 10. MétricasSaturday, February 26, 2011
  • 11. Medir alguma propriedade específica do códigoSaturday, February 26, 2011
  • 12. Objetivo: Quantificar o que antes era abstratoSaturday, February 26, 2011
  • 13. Métrica ABCSaturday, February 26, 2011
  • 14. Analisa ComplexidadeSaturday, February 26, 2011
  • 15. flog github.com/seattlerb/flogSaturday, February 26, 2011
  • 16. Assignement Definir o valor de uma variável explicitamenteSaturday, February 26, 2011
  • 17. = += *= << /= etc... -=Saturday, February 26, 2011
  • 18. Branching Criar um novo fluxo de execuçãoSaturday, February 26, 2011
  • 19. if or else rescue elsif (argh!) until case while andSaturday, February 26, 2011
  • 20. Calls Chamadas a métodosSaturday, February 26, 2011
  • 21. (Outras implementações usam Condition)Saturday, February 26, 2011
  • 22. |ABC| = sqrt((A*A)+(B*B)+(C*C))Saturday, February 26, 2011
  • 23. Mas em Ruby temos mais do que isso!Saturday, February 26, 2011
  • 24. eval & cia (pontuação alta!!!) define_method eval module_eval class_eval instance_evalSaturday, February 26, 2011
  • 25. blocos/yieldSaturday, February 26, 2011
  • 26. Introspecção instance_method method_defined? private_instance_method privante_class_method public_instance_method etc...Saturday, February 26, 2011
  • 27. Hooks Module#included Module#extended Class#inherited method_defined etc...Saturday, February 26, 2011
  • 28. Ou seja...Saturday, February 26, 2011
  • 29. Ou seja... METAPROGRAMAÇÃO É COMPLEXO E DIFICULTA A MANUTENÇÃO DO CÓDIGOSaturday, February 26, 2011
  • 30. Quando verificar isso no seu código?Saturday, February 26, 2011
  • 31. FrequentementeSaturday, February 26, 2011
  • 32. (já deixei para a fase final de um projeto e o resultado foi traumático)Saturday, February 26, 2011
  • 33. Complexidade CiclomáticaSaturday, February 26, 2011
  • 34. saikuro http://saikuro.rubyforge.org/Saturday, February 26, 2011
  • 35. Mede o número de segmentos linearmente independentes na execução do códigoSaturday, February 26, 2011
  • 36. Grafo direcionado para representar os caminhos de execuçãoSaturday, February 26, 2011
  • 37. 1 def some_method(value) 2 if value % 2 == 0 3 value.times { |i| puts i } 4 else 5 while value >= 0 6 puts value 7 value -= 1 8 end 9 end 10 endSaturday, February 26, 2011
  • 38. Início value % 2 == 0 value.times { |i| ... while value >= 0 puts value puts i puts value -= 1 FimSaturday, February 26, 2011
  • 39. C = A - V + 2P C => Complexidade ciclomática A => Número de arestas V => Número de vértices P => Número de componentes conectadosSaturday, February 26, 2011
  • 40. Pode ser utilizada para definir o número de casos de teste necessários para ter total cobertura do códigoSaturday, February 26, 2011
  • 41. Métrica procedural, mas pode ser usada em código OO no escopo de métodosSaturday, February 26, 2011
  • 42. Duplicação de códigoSaturday, February 26, 2011
  • 43. flay http://ruby.sadi.st/Flay.htmlSaturday, February 26, 2011
  • 44. Pesquisa por códigos SEMELHANTESSaturday, February 26, 2011
  • 45. Resultados são bons candidatos para refactoringSaturday, February 26, 2011
  • 46. Código que muda com muita frequênciaSaturday, February 26, 2011
  • 47. churn github.com/danmayer/churnSaturday, February 26, 2011
  • 48. Código que muda muito == problemasSaturday, February 26, 2011
  • 49. Indica quantidade de alterações ao longo do tempoSaturday, February 26, 2011
  • 50. Métodos Classes ArquivosSaturday, February 26, 2011
  • 51. git/mercurialSaturday, February 26, 2011
  • 52. Code SmellsSaturday, February 26, 2011
  • 53. Sintoma que indica algum problema mais sérioSaturday, February 26, 2011
  • 54. O código pode feder por vários motivosSaturday, February 26, 2011
  • 55. reek github.com/kevinrutherford/reekSaturday, February 26, 2011
  • 56. Aceita opções sobre quais smells identificar/ ignorarSaturday, February 26, 2011
  • 57. AtributosSaturday, February 26, 2011
  • 58. readers/writers (ou getters/setters) podem expor demais seus objetosSaturday, February 26, 2011
  • 59. Variáveis de ClasseSaturday, February 26, 2011
  • 60. 1 class MyClass 2 @@my_class_variable = 1 3 4 class << self 5 attr_accessor :my_other_class_variable 6 end 7 endSaturday, February 26, 2011
  • 61. Aumenta o escopo globalSaturday, February 26, 2011
  • 62. Classe LongaSaturday, February 26, 2011
  • 63. Muitas linhasSaturday, February 26, 2011
  • 64. Muitas variáveis de instânciaSaturday, February 26, 2011
  • 65. Muitos métodosSaturday, February 26, 2011
  • 66. *provavelmente* fazendo coisa demais!Saturday, February 26, 2011
  • 67. Método LongoSaturday, February 26, 2011
  • 68. Lista de Parâmetros LongaSaturday, February 26, 2011
  • 69. 1 def pay_with_credit_card(number, security_code, holder_name, expiration, value) 2 # ... 3 endSaturday, February 26, 2011
  • 70. Possíveis soluçõesSaturday, February 26, 2011
  • 71. Passar um hashSaturday, February 26, 2011
  • 72. Encapsular em um objetoSaturday, February 26, 2011
  • 73. Baixa Coesão Feature EnvySaturday, February 26, 2011
  • 74. 1 class Cart 2 def price 3 @item.price + @item.tax 4 end 5 endSaturday, February 26, 2011
  • 75. Baixa Coesão Utility FunctionSaturday, February 26, 2011
  • 76. Método que não depende do estado do objetoSaturday, February 26, 2011
  • 77. 1 class Oven 2 def formatted_temperature(sensor) 3 "#{sensor.temperature} #{sensor.unit}" 4 end 5 endSaturday, February 26, 2011
  • 78. Polimorfismo SimuladoSaturday, February 26, 2011
  • 79. 1 def some_method(value) 2 if value > 10 3 if value < 20 4 if value != 15 5 puts "duh" 6 else 7 puts "meh" 8 end 9 end 10 end 11 endSaturday, February 26, 2011
  • 80. switch também :) (o reek ainda não identifica)Saturday, February 26, 2011
  • 81. Uncommunicative NamesSaturday, February 26, 2011
  • 82. Nomes não refletem a intenção do códigoSaturday, February 26, 2011
  • 83. 1 class SomeClass 2 def some_method 3 # ... 4 end 5 6 def some_method_2 7 # ... 8 end 9 10 def another_method 11 a = 10 12 aLocalVariable = 25 13 end 14 endSaturday, February 26, 2011
  • 84. Pode ser configurado com uma lista de regexps default [/^.[0-9]*$/]Saturday, February 26, 2011
  • 85. Cobertura de TesteSaturday, February 26, 2011
  • 86. != “bem testado”Saturday, February 26, 2011
  • 87. rcov http://eigenclass.org/hiki.rb?rcovSaturday, February 26, 2011
  • 88. Pode indicar trechos do código que foram negligenciadosSaturday, February 26, 2011
  • 89. Too Simple To BreakSaturday, February 26, 2011
  • 90. Novas funcionalidades são adicionadas, mas continua sem testesSaturday, February 26, 2011
  • 91. Saturday, February 26, 2011
  • 92. Saturday, February 26, 2011
  • 93. Outros smells e erros de estiloSaturday, February 26, 2011
  • 94. roodi github.com/martinjandrews/roodiSaturday, February 26, 2011
  • 95. Atribuição de valor dentro de uma estrutura condicionalSaturday, February 26, 2011
  • 96. 1 # Deveria ser foo == 100 2 if foo = 100 3 # ... 4 endSaturday, February 26, 2011
  • 97. 1 # Falso positivo... 2 def some_method(value) 3 if @value = value 4 # ... 5 end 6 endSaturday, February 26, 2011
  • 98. case sem cláusula elseSaturday, February 26, 2011
  • 99. 1 def some_method(value) 2 case value 3 when 1..10 4 puts "Entre 1 e 10" 5 when 11..20 6 puts "Entre 11 e 20" 7 end 8 endSaturday, February 26, 2011
  • 100. Classes com muitas linhas de código (por padrão limita em 300)Saturday, February 26, 2011
  • 101. Padrão para nome de classes e módulos (verifica se o nome das classes e módulos está em CamelCase)Saturday, February 26, 2011
  • 102. cláusulas rescue vaziasSaturday, February 26, 2011
  • 103. 1 def calculate_factor(number) 2 begin 3 SOME_CONSTANT / number 4 rescue 5 6 end 7 endSaturday, February 26, 2011
  • 104. 1 def calculate_factor(number) 2 begin 3 SOME_CONSTANT / number 4 rescue => e 5 # Tratar a exceção de alguma forma... 6 end 7 endSaturday, February 26, 2011
  • 105. Uso de loops com forSaturday, February 26, 2011
  • 106. 1 def print_list(list) 2 for value in list do 3 puts value 4 end 5 endSaturday, February 26, 2011
  • 107. 1 def print_list(list) 2 list.each {|value| puts value } 3 endSaturday, February 26, 2011
  • 108. Métodos com muitas linhas de código (por padrão limita em 20)Saturday, February 26, 2011
  • 109. Padrão para nomes de métodos (verifica se os nomes dos métodos estão snake_case)Saturday, February 26, 2011
  • 110. rails_best_practices github.com/flyerhzm/rails_best_practicesSaturday, February 26, 2011
  • 111. Ok...Saturday, February 26, 2011
  • 112. Mas é muita coisa para gerenciar!Saturday, February 26, 2011
  • 113. metric_fu http://metric-fu.rubyforge.org/Saturday, February 26, 2011
  • 114. saikuro + flog + flay + rcov + reek + roodi + churn + rails_best_practicesSaturday, February 26, 2011
  • 115. rake metrics:allSaturday, February 26, 2011
  • 116. Integração ContínuaSaturday, February 26, 2011
  • 117. Métricas ao longo do tempoSaturday, February 26, 2011
  • 118. Relatórios!Saturday, February 26, 2011
  • 119. Saturday, February 26, 2011
  • 120. Saturday, February 26, 2011
  • 121. Saturday, February 26, 2011
  • 122. Saturday, February 26, 2011
  • 123. Problema:Saturday, February 26, 2011
  • 124. O metric_fu acaba virando uma dependência do seu projetoSaturday, February 26, 2011
  • 125. metrical github.com/iain/metricalSaturday, February 26, 2011
  • 126. $ gem install metrical $ cd /path/of/your/project $ metricalSaturday, February 26, 2011
  • 127. Dúvidas?Saturday, February 26, 2011
  • 128. Obrigado!Saturday, February 26, 2011