将代码重构为子目录

时间:2012-02-13 22:34:30

标签: ruby refactoring gem

我有两个名为 Person Animal 的类,其中包含很多方法。我需要将这些类中的一些数据导出到CSV。我还想从类文件本身重构CSV特定代码(并将其移动到模块)。因此,我创建了名为 person / animal / 的目录,并在每个目录中放入了一个csv_export.rb文件(使用CSVExport模块)。

person.rb
person/csv_export.rb
animal.rb  
animal/csv_export.rb

CSV导出的数据与两个类不同,我不能只有一个常见的csv_export.rb文件(暂时)。

person.rb的例子:

class Person
  include CSVExport

  # numerous methods...
end

csv_export.rb示例:

module CSVExport
  def to_csv
    # some logic
  end
end

我的问题是命名这两个模块以正确加载它们的正确方法是什么?在 Person / Animal 中要求它们的正确方法是什么(假设文件没有像Rails那样加载)?

1 个答案:

答案 0 :(得分:2)

我会调用模块Person::CSVExportAnimal::CSVExport。您可以require他们(来自每个单独的文件),如下所示:

require File.join(File.dirname(__FILE__), 'animal', 'csv_export.rb')

require File.join(File.dirname(__FILE__), 'person', 'csv_export.rb')

这不适用于irb内部(至少在我正在运行的Ruby 1.9.2p290中),但如果从文件运行Ruby程序,它确实有效。

你提出了一个很好的观点;如果你在animal/csv_export.rb的顶部加载(例如)animal.rb,那么Animal是一个未定义的常量。你可以这样解决这个问题:

class Animal
  module CSVExport
    # contents
  end
end

请注意,如果可以,更好的方法可能是为自己构建一些低级实用程序方法,这样可以在更高的抽象级别编写CSV导出逻辑,并使代码足够短到进入animal.rbperson.rb而不会压倒他们。我不知道这些实用程序究竟是什么;我必须看到代码提供具体的建议。