2011-11-18 2 views
0

현재로드 위치에 1 또는 100 개의 플러그인이있을 수있는 위치에 있습니다.동적으로로드 된 루비 파일이 포함 된 전역 방지

이제 문제는 각 플러그인이 시작 루비 파일 내에 정의 된 클래스의 인스턴스를 요구한다는 것입니다.

정말 간단한 예는 다음과 같습니다

#startup.rb 

def load_plugins 
    #... get each plugin file 
    require each_plugin 
end 

class MuchUsedClass 
    def do_something 
     #... 
    end 
end 

muchUsedInstance = MuchUsedClass.new 
load_plugins 

#some_plugin.rb 

class SomePluginClass 
    def initialize(muchUsedInstance) 
     @muchUsedInstance = muchUsedInstance 
    end 

    def do_something_with_instance 
     @muchUsedInstance.do_something 
    end 
end 

somePluginInstance = SomePluginClass.new(muchUsedInstance) 
somePluginInstance.do_something_with_instance 

가장 큰 문제는 당신이 필요로 호출 할 때, 그것이이 요구되고있다 전에 무슨 일이 있었는지에 대한 단서가되지 않는다는 것입니다. 그래서 다른 모든 필수 파일을 만족시키기 위해 시작 파일 내에서 전역 변수를 만드는 것이 좋지 않지만, 포함 된 파일로 일부 데이터를 전달할 수있는 유일한 방법 인 것처럼 보입니다. 또한 싱글 톤 클래스를 만들 수도 있습니다 이것의 일부를 폭로하기 위해, 그러나 그것은 또한 조금 더 심해 보입니다.

저는 여전히 루비에 익숙하지 않고 정적으로 형식이 지정된 안경을보고 있습니다. C#에서는 종속성 주입을 선택하고 그런 식으로 모든 것을 연결하는 데 괜찮은 패턴이 없을 것입니다.

답변

2

예제 코드에는 전역 변수가 없습니다. 전역 변수의 이름은 $으로 시작합니다. muchUsedInstance은 로컬 변수이며 다른 Ruby 파일간에 공유되지 않으므로 작성한 코드는 작동하지 않습니다.

당신이 이제까지 인스턴스를 변경하지 않을 경우, 당신은 쉽게 상수로 저장할 수 :

MuchUsedClass::Instance = MuchUsedClass.new 

:

MuchUsedInstance = MuchUsedClass.new 

당신은 클래스 내부의 중첩 상수로 저장할 수 있습니다 클래스 객체 내에 인스턴스 변수로 저장할 수 있습니다. 이미 없으면 자동으로 생성하는 getter 메서드를 사용합니다.

def MuchUsedClass.instance 
    @instance ||= MuchUsedClass.new 
end 
+0

네, 글로벌이 아니라는 것을 알고 있습니다. 내가 가지고있는 시나리오를 보여 주려고했는데 어떻게 해결할 수 있습니까? 다른 사람들이 생각해내는 것을보기 위해 질문을 공개적으로 남겨 둘 것입니다. 이론적으로 어디서나 인스턴스를 하드 코딩하고 싶지 않았기 때문에 좀 더 확장 가능하고 테스트하기 쉽도록하고 싶었습니다. – Grofit

관련 문제