Ruby on Rails: эффективное использование класса в каталоге lib / - PullRequest
0 голосов
/ 24 февраля 2011

Я создаю анализатор текста. В идеале это должен быть статический класс:

keywords = Dictionary.parse(text)

Однако парсер (lib / dictionary.rb) должен загрузить некоторые данные (например, stop_words.txt) в память в виде массива.

Поэтому, как я понимаю, это не может быть статический класс, поскольку мне нужен конструктор, который бы загружал эти данные перед использованием синтаксического анализатора.

Тогда:

Библиотека / dictionary.rb

def initialize
  @stop_words = load_stop_words
end

модель / entry.rb

def parse
    @dictionary = Dictionary.new
    self.keywords = @dictionary.parse(self.text)
end

Но насколько это неэффективно? Означает ли это, что если у меня 1000 записей, класс Dictionary загружает «stop_words.txt» 1000 раз, даже если содержимое файла почти постоянно?

Полагаю, мне здесь чего-то не хватает. Должно быть лучшее решение - либо без создания нескольких экземпляров класса Dictionary, либо путем загрузки данных только один раз, когда приложение работает.

Ответы [ 3 ]

1 голос
/ 24 февраля 2011

Таким образом, ваш шаблон таков, что вы хотели бы один экземпляр объекта (который является по сути постоянным и доступным только для чтения после создания экземпляра), который доступен для многих вызывающих, но создается при первом вызове?

Название этого паттерна Singleton , и в Ruby он доступен как миксин.

0 голосов
/ 24 февраля 2011

Я бы использовал инициализатор, который хранится в config/initializers и который загружается только при запуске, и идеально подходит для загрузки файлов конфигурации или настройки. Таким образом, ваш Dictionary находится в '/ lib and in '/config/initializers, вы создаете файл с именем dictionary.rb (или похожим, имя на самом деле не важно) который содержит код для загрузки ваших ключевых слов.

0 голосов
/ 24 февраля 2011

Если вы находитесь в Rails (как я полагаю по тегу и каталогу lib), он не загружается N раз: файлы lib загружаются только при загрузке Rails (если вы их измените, вам нужно перезапустить приложение) и поэтому stop_words будет загружен только один раз.Маленький пример (lib/timenow.rb):

module Timenow
  @now = Time.now

  def self.doit
    Rails.logger.warn "TIME NOW IS: #{@now}"
  end
end

В любом контроллере Timenow.doit регистрирует время загрузки этого модуля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...