2011-11-18 56 views
0

我在一個位置,在那裏我有一個插件文件夾,那裏可能有1或100插件加載。避免與動態加載的紅寶石文件的全局

現在的問題是,每個插件都需要一個在啓動ruby文件中定義的類的實例。

一個非常簡單的例子是:

#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 

的主要問題是,當你調用需要,它沒有關於被要求之前發生了什麼任何線索。所以我發現在啓動文件中創建一個全局變量只是爲了滿足所有其他需要的文件,但它似乎是能夠將一些數據傳遞給包含文件的唯一方法之一,我也可以創建一個單例類揭露這些,但這似乎也有點討厭。因爲我對ruby還不熟悉,並且仍然在尋找靜態類型的眼鏡,所以我可能會錯過一個體面的模式來解決這個問題,在C#中,我會選擇依賴注入,然後將所有的東西都勾上去。 。

回答

2

您的示例代碼沒有全局變量。全局變量的名稱以$開頭。你寫的代碼不會工作,因爲muchUsedInstance只是一個局部變量,不會在不同的Ruby文件之間共享。

如果您不打算永遠改變例如,你可以很容易地將其存儲爲一個常數:

MuchUsedInstance = MuchUsedClass.new 

你可以把它存爲類中的嵌套的常數:

MuchUsedClass::Instance = MuchUsedClass.new 

您可以將它作爲實例變量存儲在類對象中,並帶有一個getter方法,該方法在已經存在的情況下自動創建它:

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

是的,我知道它沒有一個全球性的,我試圖展示我擁有的那種場景,以及如何解決這個問題,正如你所說的,全球化與其他人一樣。我將留下這個問題,看看其他人提出的問題。理想情況下,我不想在任何地方對實例進行硬編碼,但我希望使它更具擴展性,並且更易於測試。 – Grofit