Методы рефакторинга, основанные на переменной экземпляра - PullRequest
0 голосов
/ 03 декабря 2010

Как можно реорганизовать эти методы, чтобы они не полагались на использование переменной экземпляра (@conference_facets)?

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

1 Ответ

0 голосов
/ 03 декабря 2010

Если эти фасеты хранятся в базе данных, вы можете получить счет прямо из базы данных, что гораздо более эффективно, чем циклически проходить по всем событиям, хотя вам, возможно, придется поиграться с вашим group_by и критериями соединения, так кака также моделирование ваших данных.

В любом случае, чтобы избавиться от необходимости использовать переменную экземпляра, вы можете переместить всю эту логику в одну функцию или поиграть с тем, что вы передаете между функциями.Например

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...