我在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的一些数据的基本内容。
那么,将这些分开的正确方法是什么?
在Rails 4.0.1应用程序上运行Ruby 2.0.0。
答案 0 :(得分: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
的新定义合并,因此它将添加任何已定义的新方法或覆盖任何现有的。
答案 1 :(得分:0)
您至少可以选择提取到methods
,classes
或modules
。所有这些都属于重构的任务,为此编写了很好的教程和书籍,给出了选择路径的基本原理。
在我看来,开始提取方法,看看它有什么后果。根据你有限的例子很难判断。鉴于robbrits的回答,您还可以在另一个文件中为同一个类(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