Превращение трех похожих методов в один метод - PullRequest
2 голосов
/ 16 февраля 2012

Я хочу превратить эти три метода в один, но в данный момент я не могу обернуть это вокруг себя. Осложняется тем, что 1/3 требует немного другого звонка. Все они достаточно похожи, и я знаю, что есть лучший способ, но сейчас он выходит за рамки моих навыков. Передав одну дополнительную переменную (извлекать, проверять или обрабатывать), я могу превратить ее в одну. Как это сделать, ускользает от меня.

Если бы вы реорганизовали их в один метод, как бы вы это сделали?

def fetch(subjects = current_subjects, queues = QUEUES)
  subjects.each do |s|
    queues.each { |x| fetch_results(x, s) } unless queue.nil?
  end
end

def check(subjects = current_subjects, queues = QUEUES)
  subjects.each do |s|
    queues.each { |x| check_results(s["#{x}_recent"]) } unless queue.nil?
  end
end

def process(subjects = current_subjects, queues = QUEUES)
  subjects.each do |s|
    queues.each { |x| process_results(s["#{x}_recent"]) } unless queue.nil?
  end
end

РЕДАКТИРОВАТЬ: одно решение близко к тому, о чем я думал ранее, но я не дал понять, что хочу передать what в виде небольшого массива, который может быть расширяемым и может использоваться для указания получить, проверить или обработать или любую их комбинацию. Итак, по сути, я пытаюсь перебрать три вещи одним методом:

  • действие, которое: I.E., получить, проверить или обработать.
  • любое количество предметов.
  • любое количество очередей, которое на данный момент является константой.

Также, другие решения здесь:

http://refactormycode.com/codes/2002-three-into-one

Ответы [ 4 ]

2 голосов
/ 16 февраля 2012

@ Lucapette предлагает нисходящее решение (которое, я думаю, в большинстве случаев подходит).Тем не менее, @Tony правильно указывает, что методы могут развиваться, и поэтому он может быть слишком жестким.Альтернативным решением является восходящий подход:

def iter_queues(subjects, queues)
  subjects.each do |subject|
    (queues || []).each { |queue| yield(queue, subject) }
  end
end

def fetch(subjects = current_subjects, queues = QUEUES)
  iter_queues(subjects, queues) { |q, s| fetch_results(q, s) }
end

То же самое для других методов.Кстати, этот двойной each также может быть записан:

subjects.product(queues).each { ... }
1 голос
/ 16 февраля 2012

Я мог бы сделать что-то вроде этого:

def with(subjects,queues)
    subjects.each do |subject|      
        queues.each do |queue|
            yield subject, queue
        end
    end
end

with(my_subjects, my_queues){|s, q| fetch_results(q, s)}
1 голос
/ 16 февраля 2012
def execute(what, subjects = current_subjects, queue = QUEUES)
  subjects.each do |s|
    queue.each { |x| send("#{what}_results", s["#{x}_recent"] ) } unless queue.nil?
  end
end

это способ сделать это. Разумеется, наименование зависит от вас.

0 голосов
/ 16 февраля 2012

Почему вы хотите преобразовать их в одну функцию? Они похожи сейчас, но что, если они развиваются позже и становятся другими? Каждая функция имеет свое назначение и должна быть оставлена ​​как отдельная функция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...