2010-12-03 6 views
0

Comment refactoriser ces méthodes afin qu'elles ne reposent pas sur l'utilisation d'une variable d'instance (@conference_facets)?Méthodes de refactorisation qui s'appuient sur la variable d'instance

def count_conf_facets(events) 
    @conference_facets = {} 
    for event in events do 
    home_team_conf = event.home_team_conf 
    away_team_conf = event.away_team_conf 
    increment_conf_facet(home_team_conf) 
    if home_team_conf.id != away_team_conf.id then 
     increment_conf_facet(away_team_conf) 
    end 
    end 
end 

def increment_conf_facet(conference) 
    if @conference_facets[conference.id].nil? then 
    @conference_facets[conference.id] = 0 
    end 
    @conference_facets[conference.id] += 1 
end 

Répondre

0

Si ces facettes sont stockées dans une base de données, vous pouvez obtenir le nombre dès la sortie de la base de données, ce qui est beaucoup plus efficace que boucle à travers tous les événements, bien que vous pourriez avoir à jouer avec votre group_by et joindre des critères, ainsi que votre modélisation de données. De toute façon, pour se débarrasser d'avoir à utiliser une variable d'instance, vous pouvez déplacer toute cette logique dans une seule fonction, ou jouer avec ce que vous passez entre les fonctions. Par exemple

def count_conf_facets(events) 
    counts = {} 
    events.each do |event| 
    [event.home_team_conf.id, event.away_team_conf.id].uniq.each do |conf_id| 
     counts[conf_id] ||= 0 
     counts[conf_id] += 1 
    end 
    end 

    counts 
end 
+0

c'est plutôt joli ... cld vous expliquez comment vous avez su utiliser la méthode uniq pour éviter le double comptage? – keruilin

+0

Une if-instruction est tout aussi valide, et probablement plus efficace, mais je voulais capturer que dans le cas par défaut, nous faisons la même chose pour les deux ID de conférence, donc je laisse le même casse géré par l'appel uniq. Si le tableau était plus long, il serait plus efficace de le construire avec des instructions if, en décidant quels identifiants de conférence mettre. –

Questions connexes