0
Analisando Complexidade de         Código Ruby                    Utilizando Métricas para Encontrar Código que Fede      ...
Cássio Marques                     • código + comida vegan + livros + skate +                              música         ...
Porque analisar o                                  código?Saturday, February 26, 2011
http://www.flickr.com/photos/rovingi/312078231/Saturday, February 26, 2011
Como analisar o                                 código?Saturday, February 26, 2011
EstéticaSaturday, February 26, 2011
Dificuldade de                               ManutençãoSaturday, February 26, 2011
ChuteSaturday, February 26, 2011
AbstraçõesSaturday, February 26, 2011
MétricasSaturday, February 26, 2011
Medir alguma                     propriedade específica                           do códigoSaturday, February 26, 2011
Objetivo: Quantificar o                   que antes era abstratoSaturday, February 26, 2011
Métrica ABCSaturday, February 26, 2011
Analisa ComplexidadeSaturday, February 26, 2011
flog                              github.com/seattlerb/flogSaturday, February 26, 2011
Assignement                              Definir o valor de uma variável explicitamenteSaturday, February 26, 2011
=    +=                              *=    <<                              /=   etc...                              -=Satu...
Branching                              Criar um novo fluxo de execuçãoSaturday, February 26, 2011
if                                      or                         else                                    rescue         ...
Calls                              Chamadas a métodosSaturday, February 26, 2011
(Outras implementações usam Condition)Saturday, February 26, 2011
|ABC| = sqrt((A*A)+(B*B)+(C*C))Saturday, February 26, 2011
Mas em Ruby temos                               mais do que isso!Saturday, February 26, 2011
eval & cia                              (pontuação alta!!!)                               define_method                    ...
blocos/yieldSaturday, February 26, 2011
Introspecção                                  instance_method                                  method_defined?             ...
Hooks                              Module#included                              Module#extended                           ...
Ou seja...Saturday, February 26, 2011
Ou seja...                  METAPROGRAMAÇÃO É COMPLEXO E DIFICULTA                         A MANUTENÇÃO DO CÓDIGOSaturday,...
Quando verificar isso                          no seu código?Saturday, February 26, 2011
FrequentementeSaturday, February 26, 2011
(já deixei para a fase final                  de um projeto e o              resultado foi traumático)Saturday, February 26...
Complexidade                               CiclomáticaSaturday, February 26, 2011
saikuro                              http://saikuro.rubyforge.org/Saturday, February 26, 2011
Mede o número de                   segmentos linearmente                      independentes na                     execuçã...
Grafo direcionado para                      representar os                  caminhos de execuçãoSaturday, February 26, 2011
1 def some_method(value)                          2   if value % 2 == 0                          3     value.times { |i| p...
Início                                            value % 2 == 0                              value.times { |i| ...       ...
C = A - V + 2P                                  C => Complexidade ciclomática                                     A => Núm...
Pode ser utilizada para                     definir o número de casos                     de teste necessários para        ...
Métrica procedural,                  mas pode ser usada em                  código OO no escopo                       de m...
Duplicação de códigoSaturday, February 26, 2011
flay                              http://ruby.sadi.st/Flay.htmlSaturday, February 26, 2011
Pesquisa por códigos                            SEMELHANTESSaturday, February 26, 2011
Resultados são bons                                candidatos para                                  refactoringSaturday, F...
Código que muda com                      muita frequênciaSaturday, February 26, 2011
churn                              github.com/danmayer/churnSaturday, February 26, 2011
Código que muda                              muito == problemasSaturday, February 26, 2011
Indica quantidade de                    alterações ao longo do                            tempoSaturday, February 26, 2011
Métodos                              Classes                              ArquivosSaturday, February 26, 2011
git/mercurialSaturday, February 26, 2011
Code SmellsSaturday, February 26, 2011
Sintoma que indica                         algum problema mais                                sérioSaturday, February 26, ...
O código pode feder                          por vários motivosSaturday, February 26, 2011
reek                              github.com/kevinrutherford/reekSaturday, February 26, 2011
Aceita opções sobre                   quais smells identificar/                           ignorarSaturday, February 26, 2011
AtributosSaturday, February 26, 2011
readers/writers (ou                   getters/setters) podem                      expor demais seus                       ...
Variáveis de ClasseSaturday, February 26, 2011
1 class MyClass  2   @@my_class_variable = 1  3  4   class << self  5     attr_accessor :my_other_class_variable  6   end ...
Aumenta o escopo                                   globalSaturday, February 26, 2011
Classe LongaSaturday, February 26, 2011
Muitas linhasSaturday, February 26, 2011
Muitas variáveis de                                   instânciaSaturday, February 26, 2011
Muitos métodosSaturday, February 26, 2011
*provavelmente*                       fazendo coisa demais!Saturday, February 26, 2011
Método LongoSaturday, February 26, 2011
Lista de Parâmetros                                     LongaSaturday, February 26, 2011
1 def pay_with_credit_card(number, security_code, holder_name, expiration, value)           2   # ...           3 endSatur...
Possíveis soluçõesSaturday, February 26, 2011
Passar um hashSaturday, February 26, 2011
Encapsular em um                                   objetoSaturday, February 26, 2011
Baixa Coesão                                Feature EnvySaturday, February 26, 2011
1 class Cart                              2   def price                              3     @item.price + @item.tax        ...
Baixa Coesão                                Utility FunctionSaturday, February 26, 2011
Método que não                     depende do estado do                            objetoSaturday, February 26, 2011
1 class Oven                              2   def formatted_temperature(sensor)                              3     "#{sens...
Polimorfismo SimuladoSaturday, February 26, 2011
1 def some_method(value)                               2   if value > 10                               3     if value < 20...
switch também :)                                (o reek ainda não identifica)Saturday, February 26, 2011
Uncommunicative                                  NamesSaturday, February 26, 2011
Nomes não refletem a                      intenção do códigoSaturday, February 26, 2011
1 class SomeClass                               2   def some_method                               3     # ...             ...
Pode ser configurado com           uma lista de regexps                              default [/^.[0-9]*$/]Saturday, Februar...
Cobertura de TesteSaturday, February 26, 2011
!= “bem testado”Saturday, February 26, 2011
rcov                              http://eigenclass.org/hiki.rb?rcovSaturday, February 26, 2011
Pode indicar trechos do                   código que foram                     negligenciadosSaturday, February 26, 2011
Too Simple To BreakSaturday, February 26, 2011
Novas funcionalidades                      são adicionadas, mas                       continua sem testesSaturday, Februar...
Saturday, February 26, 2011
Saturday, February 26, 2011
Outros smells                                     e                              erros de estiloSaturday, February 26, 2011
roodi                              github.com/martinjandrews/roodiSaturday, February 26, 2011
Atribuição de valor                            dentro de uma                         estrutura condicionalSaturday, Februa...
1 # Deveria ser foo == 100                              2 if foo = 100                              3   # ...             ...
1 # Falso positivo...                              2 def some_method(value)                              3   if @value = v...
case sem cláusula                                   elseSaturday, February 26, 2011
1 def some_method(value)                              2   case value                              3   when 1..10          ...
Classes com muitas                               linhas de código                                 (por padrão limita em 30...
Padrão para nome de                          classes e módulos        (verifica se o nome das classes e módulos está em Cam...
cláusulas rescue                                    vaziasSaturday, February 26, 2011
1 def calculate_factor(number)                              2   begin                              3     SOME_CONSTANT / n...
1 def calculate_factor(number)      2   begin      3     SOME_CONSTANT / number      4   rescue => e      5     # Tratar a...
Uso de loops com forSaturday, February 26, 2011
1 def print_list(list)                              2   for value in list do                              3     puts value...
1 def print_list(list)                     2   list.each {|value| puts value }                     3 endSaturday, February...
Métodos com muitas                           linhas de código                              (por padrão limita em 20)Saturd...
Padrão para nomes de                           métodos                    (verifica se os nomes dos métodos estão snake_cas...
rails_best_practices                               github.com/flyerhzm/rails_best_practicesSaturday, February 26, 2011
Ok...Saturday, February 26, 2011
Mas é muita coisa para                          gerenciar!Saturday, February 26, 2011
metric_fu                              http://metric-fu.rubyforge.org/Saturday, February 26, 2011
saikuro + flog + flay + rcov        + reek + roodi + churn +           rails_best_practicesSaturday, February 26, 2011
rake metrics:allSaturday, February 26, 2011
Integração ContínuaSaturday, February 26, 2011
Métricas ao longo do                                tempoSaturday, February 26, 2011
Relatórios!Saturday, February 26, 2011
Saturday, February 26, 2011
Saturday, February 26, 2011
Saturday, February 26, 2011
Saturday, February 26, 2011
Problema:Saturday, February 26, 2011
O metric_fu acaba            virando uma dependência                 do seu projetoSaturday, February 26, 2011
metrical                              github.com/iain/metricalSaturday, February 26, 2011
$ gem install metrical                              $ cd /path/of/your/project                              $ metricalSatu...
Dúvidas?Saturday, February 26, 2011
Obrigado!Saturday, February 26, 2011
Upcoming SlideShare
Loading in...5
×

Analisando Complexidade de Código Ruby

3,762

Published on

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

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,762
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
24
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Transcript of "Analisando Complexidade de Código Ruby"

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

    Clipping is a handy way to collect important slides you want to go back to later.

×