在类中组织代码块的正确方法?

时间:2013-12-06 18:51:40

标签: ruby-on-rails ruby sidekiq

我在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。

2 个答案:

答案 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)

您至少可以选择提取到methodsclassesmodules。所有这些都属于重构的任务,为此编写了很好的教程和书籍,给出了选择路径的基本原理。

在我看来,开始提取方法,看看它有什么后果。根据你有限的例子很难判断。鉴于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