Рефакторинг кода в подкаталоги - PullRequest
0 голосов
/ 14 февраля 2012

У меня есть два класса с именами 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 Ответ

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

Я бы назвал модули Person::CSVExport и Animal::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.rb и person.rb, не подавляя их. Я не знаю, какими именно были бы эти утилиты; Мне нужно увидеть код, чтобы предложить конкретные предложения.

...