2013-12-06 2 views
0

У меня есть класс в работнике Sidekiq, у которого есть блоки кода, которые я бы хотел переместить в отдельные файлы для организационных целей. Как мне это сделать?Правильный способ организовать блоки кода внутри класса?

# /app/workers/pull_data_worker.rb 
class PullDataWorker 
    include Sidekiq::Worker 

    def perform(account_id) 
    account = Account.find(account_id) 

    # Chunk A 
    # block of code that does something 

    # Chunk B 
    # block of code that does something 

    # Chunk C 
    # block of code that does something 
    end 
end 

Каждый из этих «кусков» представляет собой всего лишь несколько блоков кода, которые обрабатывают некоторые данные. Это не методы. Просто основные вещи, которые охватывают некоторые данные, извлекаемые из разных сторонних API.

Итак, как правильно их разделить?

Running Ruby 2.0.0 on Rails 4.0.1 Приложение.

+1

Почему вы не делаете частные методы для каждого блока? –

+0

У вас есть дублирование этого же блока кода у других работников? – usha

+0

@ Vimsha Нет. Это скорее «святое дерьмо, код в этом файле становится безумно длинным, я бы хотел разделить его на более мелкие куски». – Shpigford

ответ

0

У вас есть как минимум выбор экстракта в methods, classes или modules. Все это вписывается в задачу рефакторинга, для которой написаны хорошие учебники и книги, дающие объяснения относительно того, какой путь выбрать.

На мой взгляд, начните извлечение методов и посмотрите, какие последствия у него есть. Его трудно судить по вашему ограниченному примеру. Учитывая ответные грабители, вы также можете определить метод для одного и того же класса (PullDataWorker) в другом файле - для удобства обслуживания я бы этого не сделал, но кто-то может не знать, что дополнительные методы определены где-то в другом месте.

class PullDataWorker 
    include Sidekiq::Worker 
    include ThisProject::ChunkC 

def perform(account_id) 
    account = Account.find(account_id) 

    # Extracted method, see below. 
    do_chunk_a account 

    # From other class, see below. 
    ChunkBDoer.new.do_stuff 

    # From module ThisProject::ChunkC . 
    chunkC_do_stuff 
    end 

    private 

    def do_chunk_a(account) 
    end 
end 

class ChunkBDoer 
    def do_stuff 
    end 
end 
0

В Ruby у вас есть концепция «открытых классов», а это значит, что при определении кода в классе по нескольким файлам это не имеет большого значения.

Скажем у вас есть один файл, как это (a.1.rb):

class A 
    def foo1 
    # some stuff 
    end 
end 

Затем другой файл, как это (a.2.rb):

class A 
    def foo2 
    # some stuff 
    end 
end 

Тогда из любой точки мира:

require_relative "path/to/a.1" 
require_relative "path/to/a.2" 

a = A.new 
a.foo1 
a.foo2 

Когда вам требуется a.2.rb, она сливается существующее определение A с новым определением A, поэтому он добавит любые новые методы, определенные или перезаписывающие любые существующие.

+0

Но это работает, когда блоки кода являются частью метода в классе? В моем примере блоки кода, которые я пытаюсь вытащить в свой собственный файл, находятся внутри метода 'perform()'. – Shpigford

+0

Вам придется вытащить эти блоки в свои собственные методы, а затем вызвать методы из 'perform'. При условии, что вам потребовался дополнительный файл (ы) до первого вызова 'perform', тогда он будет работать нормально. – robbrit

Смежные вопросы