I have been working on this plugin system. I thought I passed design and started implementing. Now I wonder if I should revisit my design. my problem is the following:
Currently in my design I have:
An interface class
FileNameLoader
for loading the names of all the shared libraries my application needs to load. i.e. Load all files in a directory, Load all files specified in a XML file, Load all files user inputs, etc.An Interface class
LibLoader
that actually loads the shared object. This class is only responsible for loading a shared object once its file name has been given. There are various ways one may need to load a shared lib. i.e. UseRTLD_NOW
/RTLD_LAZY
...., check if lib has been already loaded, etc.An ABC
Plugin
which loads the functions I need from a handle to a library once that handle is supplied. There are so many ways this could change.An interface class
PluginFactory
which createsPlugin
s.An ABC
PluginLoader
which is the mother class which manages everything.
Now, my problem is I feel that FileNameLoader
and LibLoader
can go inside Plugin
. But this would mean that if someone wanted to just change RTLD_NOW
to RTLD_LAZY
he would have to change Plugin
class. On the other hand, I feel that there are too many classes here. Please give some input. I can post the interface code if necessary. Thanks in advance.
EDIT:
After giving this some thought, I have come to the conclusion that more interfaces is better (In my scenario at least). Suppose there are x
implementations of FileNameLoader
, y
implementations of LibLoader
, z
implementations of Plugin
. If I keep these classes separate, I have to write x + y + z
implementation classes. Then I can combine them to get any functionality possible. On the other hand, if all these interfces were in Plugin
class, I'd have to write x*y*z
implementation classes to get all the possible functionalities which is larger than x + y + z
given that there are at least 2 implementations for an interface. This is just one side of it. The other advantage is, the purpose of the interfaces are more clearer when there are more interfaces. At least that is what I think.