共享对象加载器的设计问题

时间:2010-10-12 10:23:34

标签: c++

我一直在开发这个类,用于以应用程序的共享对象的形式加载插件。我目前已经想到了两种加载应用程序加载的所有插件的文件名的方法。我编写了一个用于加载文件名的界面。我有一些关于如何改进这种设计的问题。请帮忙。感谢。

编辑:每个反馈的代码更改: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;
};

还有什么看似丑陋的吗?无论如何,感谢您的反馈。

3 个答案:

答案 0 :(得分:1)

我认为您的功能分布在enumFileNameLoaderPluginLoader类中。

我的建议是创建一个PluginLoaderByFile类和一个PluginLoaderByDir类 - 可能有一个继承自另一个,或者可能有一个共同的基类。通过这种方式,您可以定义其他子类,包括必要的附加代码,并在必要时将其封装在轨道中。

这也使得使用例如更容易将来factorybuilder模式。

答案 1 :(得分: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;
};

答案 2 :(得分:0)

至于你对当前问题的陈述。 你可以使用

  • params的矢量或
  • 因为你正在使用一个字符串你也可以用一些分隔符解析它(比如“”,“,”)

但是我不会让插件或加载方法在PluginLoader中可见。

而是使用通用/通用接口。