Изменение поведения по умолчанию в приложении C ++ с помощью плагинов [закрыто]
Вопрос
Вкратце: как лучше всего спроектировать и реализовать механизм фабрики + плагинов, чтобы плагины могли заменять объекты в основном приложении.
У нас есть кодовая база, из которой мы строим наши приложения. Кодовая база подходит для 70-95% приложений, что означает, что в каждом новом приложении нам нужно изменить 5-30% поведения по умолчанию (добавить новые функции, изменить логику по умолчанию, добавить графический интерфейс и т. Д.). р>
Реализация основана на плагинах: база кода встроена в EXE и DLL, а когда работает основной EXE, мы загружаем DLL, которая добавляет необходимые функции.
В настоящее время каждый плагин предоставляет следующую функцию:
PluginInterface* PluginInit()
{
return new MyCustomizedPluginInterface();
}
Где PluginInterface определяется как:
class PluginInterface {
public:
virtual SomeClass1* customizedSomeClass1() = 0;
virtual SomeClass2* customizedSomeClass2() = 0;
};
И SomeClass1 / SomeClass2 имеют поведение по умолчанию, но могут быть переопределены и изменены плагином.
Текущая реализация затрудняет добавление новых пользовательских классов. Мы хотели бы заменить каждый класс в основном приложении из плагина, поэтому имеет смысл использовать фабрики объектов.
Один известный мне SDK использует следующую технику:
PluginInterface* PluginInit(GodObject* godObject)
{
FactoryForSomeClasses* factoryForSomeClasses =
godObject->factoryForSomeClasses();
factoryForSomeClasses->setSomeClass1Creator( MyCustomizedSomeClass1::create); // create is a static creator function.
factoryForSomeClasses->setSomeClass2Creator( MyCustomizedSomeClass2::create);
}
Интересно, есть ли альтернативы этому подходу?
Как бы вы посоветовали разработать и внедрить систему / фабрику плагинов, как я только что описал?
Решение
В «Докторе Добб» недавно была статья, в которой обсуждалась именно эта проблема. Вот ссылка на данную статью.
Кроме того, вы можете придерживаться прямого интерфейса C для плагинов к вашему проекту. Таким образом, вы можете связать код, написанный практически на любом языке, в вашу среду с минимальными трудностями. В то время как C ++ хорош, возможность использовать больше, чем то, что существует в C ++, например невероятные фреймворки, существующие в землях Java и Python, может оказаться полезной в долгосрочной перспективе.
Другие советы
Вы смотрели примеры CodeProject для платформ плагинов? https://secure.codeproject.com/KB/DLL/plugin.aspx http://www.codeproject.com/KB/library/dynobj.aspx р>