11. config/routes.rb
match ‘/’, :to => ‘root#index’
match ‘root’, :to => ‘root#index’
namespace :admin do
resources :grids do
resources :nodes
resources :edges do
collection do
post :all
post :update_all
end
end
resources :walkers
end
end
resources :nodes, :only => [:show,:new,:create,:destroy] do
put :directions, :on => :collection
end
resources :walkers, :only => [:show,:new,:create,:destroy] do
get :select, :on => :collection
end
resources :itineraries, :only => [:show]
Sunday 30 May 2010 map.four_oh_four '*path' , :controller => 'four_oh_fours'
23. FLOG
Assignment Branch Condition (ABC)
def score_method(tally)
a, b, c = 0, 0, 0
tally.each do |cat, score|
case cat
when :assignment then a += score
when :branch then b += score
else c += score
end
end
Math.sqrt(a*a + b*b + c*c)
end
Sunday 30 May 2010
24. FLOG
Weighing the AST with factors
def process_if(exp)
add_to_score :branch
process exp.shift # cond
penalize_by 0.1 do
process exp.shift # true
process exp.shift # false
end
s()
end
Sunday 30 May 2010
25. FLOG
Methods
Very good: < 20
All Right: < 50
Sunday 30 May 2010
27. FLAY
flay *.rb
Total score (lower is better) = 621
1) IDENTICAL code found in :defn (mass*2 = 188)
channel.rb:48
clip.rb:80
2) Similar code found in :defn (mass = 93)
channel.rb:150
clip.rb:110
clip.rb:116
3) Similar code found in :defs (mass = 58)
contact.rb:32
contact.rb:37
Sunday 30 May 2010
28. FLAY
RubyParser
def mass
@mass ||= self.structure.flatten.size
end
Hash of structure of nodes with mass >
threshold
self.hashes[node.structural_hash] << node
analyze:
if same hash = similar
if same node = identical
Sunday 30 May 2010
29. Saikuro
cyclomatic
complexity
Sunday 30 May 2010
31. Saikuro
ruby-lex
every keyword is interpreted into
‘state’
state used to calculate
if, unless, while, until, for, elsif, when, rescue
(blocks)
Recursively
Sunday 30 May 2010
33. Roodi
‘Ruby Object Oriented Design Inferometer’
nutmeg66 on flickr
Sunday 30 May 2010
34. Roodi
app/controllers/itineraries_controller.rb:4 - Method name "show" cyclomatic complexity
is 14. It should be 8 or less.
app/models/itinerary.rb:41 - Block cyclomatic complexity is 6. It should be 4 or less.
app/controllers/itineraries_controller.rb:4 - Method "show" has 30 lines. It should
have 20 or less.
app/helpers/application_helper.rb:27 - Method "clippy" has 26 lines. It should have 20
or less.
Sunday 30 May 2010
37. Reek
more OO-specific checks
Control Couple
Data Clump
Feature Envy
Large Class
Long Method
Long Parameter List
Simulated Polymorphism
Uncommunicative Name
Sunday 30 May 2010
38. Reek
UserSessionsController has no descriptive comment (Irresponsible Module)
UserSessionsController#destroy calls current_user_session twice
(Duplication)
app/controllers/users_controller.rb -- 5 warnings:
UsersController has no descriptive comment (Irresponsible Module)
UsersController tests @aid_app at least 4 times (Simulated Polymorphism)
UsersController#create calls params 3 times (Duplication)
UsersController#create calls params[:user] 3 times (Duplication)
...
Sunday 30 May 2010
39. Reek
RubyParser
extends parsed nodes
traverses nodes
returns code after Ruby2Ruby
Sunday 30 May 2010
41. rails_best_practices
./app/controllers/ws/vmg/aid_user_accounts_controller.rb:160 - move model logic into model
(@aid_user_account called_count > 4)
./app/controllers/ws/vmg/ipt_controller.rb:102 - move model logic into model (xml
called_count > 4)
./app/controllers/ws/vmg/ipt_controller.rb:102 - move model logic into model (pf
called_count > 4)
./config/routes.rb:3 - overuse route customizations (customize_count > 3)
./config/routes.rb:35 - overuse route customizations (customize_count > 3)
./app/models/vmg/scenario.rb:41 - keep finders on their own model
Sunday 30 May 2010
45. Churn
Not only classes but also methods
(RubyParser)
Version control: git, Hg, svn
Locates changes in source using logs
(as in git log)
Sunday 30 May 2010
46. Churn
common sense ...
mostly useful in maintenance phase
Sunday 30 May 2010
52. Heckle
ParseTree + Ruby2Ruby
mutate
time-consuming: combinatorials
more for small programs (gems,
scripts)
doesn’t work for ruby 1.9
(ParseTree)
Sunday 30 May 2010
53. Heckle
Initial tests pass. Let's rumble.
**********************************************************************
*** AidApp#property_names loaded with 4 possible mutations
**********************************************************************
4 mutations remaining...
Replacing AidApp#property_names with:
--- original
+++ mutation
def property_names
- (meta_policy and meta_policy.property_names_for(:aid_app))
+ (nil and meta_policy.property_names_for(:aid_app))
end
Sunday 30 May 2010