2011-02-24 3 views
0

저는 텍스트 파서를 작성했습니다.Ruby on Rails : lib/디렉토리의 클래스를 효율적으로 사용합니다.

keywords = Dictionary.parse(text) 

그러나, 파서 (LIB/dictionary.rb)의 어레이로서 메모리에 (예, 'stop_words.txt'의) 일부 데이터를로드한다 : 이상적으로 정적 클래스이어야한다.

따라서 파서가 사용되기 전에 해당 데이터를로드하는 생성자가 필요하므로 정적 클래스 일 수는 없습니다. 그런 다음

:

lib 디렉토리/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 클래스의 여러 인스턴스를 만들지 않거나 응용 프로그램이 실행 중일 때 데이터를 한 번만로드하여 더 나은 솔루션이 있어야합니다.

+0

클래스 (정적) 변수에 stop_words 목록을 남기고 Dictionary.parse 메소드에서 첫 번째 필요성에 따라 지연 초기화를 수행함으로써 정적 접근법을 사용할 수 있습니다 ... – Romain

답변

0

config/initializers에 저장된 이니셜 라이저를 사용하며 시작시에만로드되며 구성 파일을로드하거나 설정하는 데 적합합니다. 그래서 당신의 Dictionary은/lib and in '/config/initializers에 있습니다. dictionary.rb (또는 그 이름은 실제로 중요하지 않습니다)이라는 파일을 만듭니다. 에는 키워드를로드하는 코드가 들어 있습니다.

1

많은 호출자가 액세스 할 수 있지만 인스턴스가 처음 호출 될 때 인스턴스화하는 객체의 단일 인스턴스 (인스턴스화 후 사실상 일정하고 읽기 전용 임)를 원한다는 것이 사용자의 패턴입니다.

이 패턴의 이름은 싱글 톤이며 Ruby에는 믹스 인으로 제공됩니다.

+0

정적 접근법도 가능합니다 (내 의견 참조). 질문). – Romain

+0

사실,하지만 휠을 해결 된 문제로 생각합니다. – glenatron

0

레일스에 있다면 (태그와 lib 디렉토리로 가정하면) N 번로드되지 않습니다. lib 파일은 레일스 부팅시에만로드됩니다 (변경하면 레일즈를 다시 시작해야합니다. 응용 프로그램)이므로 stop_words이 한 번만로드됩니다. 리틀 예 (lib/timenow.rb) : 모든 컨트롤러에서

module Timenow 
    @now = Time.now 

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

Timenow.doit는이 모듈이로드 된 시간을 기록합니다.