我一直在开发这个类,用于以应用程序的共享对象的形式加载插件。我目前已经想到了两种加载应用程序加载的所有插件的文件名的方法。我编写了一个用于加载文件名的界面。我有一些关于如何改进这种设计的问题。请帮忙。感谢。
编辑:每个反馈的代码更改: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 :(得分:1)
我认为您的功能分布在enum
,FileNameLoader
和PluginLoader
类中。
我的建议是创建一个PluginLoaderByFile
类和一个PluginLoaderByDir
类 - 可能有一个继承自另一个,或者可能有一个共同的基类。通过这种方式,您可以定义其他子类,包括必要的附加代码,并在必要时将其封装在轨道中。
答案 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)
至于你对当前问题的陈述。 你可以使用
但是我不会让插件或加载方法在PluginLoader中可见。
而是使用通用/通用接口。