2010-10-12 62 views
0

我一直在開發這個類,以應用程序的共享對象的形式加載插件。我目前想到了兩種加載應用程序加載的所有插件的文件名的方法。我寫了一個加載文件名的界面。我有幾個關於如何改進這種設計的問題。請幫忙。謝謝。共享對象加載器的設計問題

編輯:每個反饋的代碼更改:D。

#include "Plugin.h" 

//This class is an interface for loading the list of file names of shared objects. 
//Could be by loading all filienames in a dir, or by loading filenames specified in a file. 
class FileNameLoader 
{ 
    public: 
     virtual std::list<std::string>& LoadFileNames() = 0; 
}; 

class PluginLoader 
{ 
public: 
    explicit PluginLoader(LoadingMethod, const std::string& = ""); 
    virtual ~PluginLoader(); 

    virtual bool Load(); 

    virtual bool LoadPlugins(FileNameLoader&); 
    virtual bool LoadFunctions(); 

protected: 
private: 
    explicit PluginLoader(const PluginLoader&); 
    PluginLoader& operator=(const PluginLoader&); 

    bool LoadSharedObjects(); 

    list<std::string> l_FileNames; 
    list<PluginFunction*> l_Functions; 
    list<Plugin*> l_Plugins; 
}; 

任何似乎很醜陋的東西仍然?無論如何感謝您的反饋。

+0

聽起來可能是時候申請[YAGNI](http://en.wikipedia.org/wiki/You_ain't_gonna_need_it):) – sje397 2010-10-12 10:33:09

+0

除了上面你可以緩存你的插件數據爲'std :: unordered_map >' – erjot 2010-10-12 10:34:31

回答

0

您創建了一個很好的界面,但不使用它。然後您將文件名存儲在私有成員l_FileNames中。

我會更改PluginLoader構造函數以接受FileNameLoader引用並使用該引用來加載文件名。這樣你就不需要PluginLoader類中的LoadingMethod了。

編寫兩個實現FileNameLoader接口的類,每個接口有一個用於每個加載方法。

編輯:

class FileNameLoader 
{ 
    public: 
     //RVO will work right? :D 
     virtual std::list<std::string>& LoadFileNames() = 0; 
}; 

class FileNameLoaderByFile : public FileNameLoader 
{ 
public: 
    std::list<std::string>& LoadFileNames() 
    { 
     // ... 
    } 

} 

class FileNameLoaderByDirectory : public FileNameLoader 
{ 
public: 
    std::list<std::string>& LoadFileNames() 
    { 
     // ... 
    } 

} 



class PluginLoader 
{ 
public: 
    explicit PluginLoader(FileNameLoader& loader) 
    { 
    fileNames = loader.LoadFileNames() 
    } 

    virtual ~PluginLoader(); 

private: 
    list<std::string> fileNames; 
}; 
+0

我很清楚,不管用哪種方式生成文件名,它們都是列表。這就是爲什麼我爲文件名生成功能寫了一個接口。 – nakiya 2010-10-12 10:37:29

+0

是的,這就是爲什麼我說你不需要班級中的加載方法,你已經有了界面。 – vulkanino 2010-10-12 10:39:52

+0

如果我將其更改爲:'virtual bool LoadPlugins(FileNameLoader *);'?並從外部提供文件名稱加載程序? – nakiya 2010-10-12 10:42:21

1

它看起來像你對我有整個enumFileNameLoader您的功能性傳播和PluginLoader類。

我的建議是創建一個PluginLoaderByFile類和一個PluginLoaderByDir類 - 可能有一個從另一個繼承,或可能與一個公共基類。通過這種方式,您可以定義其他子類,包括必要的附加代碼,並在必要時將其封裝在軌道中。

這也使得它更容易使用,例如,未來的factorybuilder模式。

+0

那麼會不會有很多代碼被複制?我很抱歉無情,我只想知道推理。 :D – nakiya 2010-10-12 10:39:38

+0

爲什麼代碼會被複制?這使您可以將通用代碼放入基類中。 – sje397 2010-10-12 10:58:06

+0

我真的很想避免的兩件事:(1)用例如參數向量,或(2)總是返回大小爲1的列表的函數。 – sje397 2010-10-12 11:01:27

0

至於你對當前問題的陳述。 U可以使用任一

  • 向量PARAMS或
  • 因爲u的使用字符串ü可以使用一些分隔符以及解析它(說 「」, 「」)

但是我不會讓加載的參數或方法在PluginLoader中可見。

改爲使用通用/通用接口。