2008-11-22 3 views
3

Вкратце: какой лучший способ разработать и внедрить механизм фабрики + плагин, чтобы плагины могли заменять объекты в главном приложении.Изменение поведения по умолчанию в приложении 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 имеют некоторое поведение по умолчанию, но может быть отменено и изменено с помощью плагина ,

Текущая реализация затрудняет добавление новых настраиваемых классов. Мы хотели бы заменить каждый класс в главном приложении плагином, поэтому имеет смысл использовать объекты-объекты.

One SDK, который я знаю, использует следующую технику:

PluginInterface* PluginInit(GodObject* godObject) 
{ 
    FactoryForSomeClasses* factoryForSomeClasses = 
     godObject->factoryForSomeClasses(); 
    factoryForSomeClasses->setSomeClass1Creator(MyCustomizedSomeClass1::create); // create is a static creator function. 
    factoryForSomeClasses->setSomeClass2Creator(MyCustomizedSomeClass2::create); 
} 

Интересно, есть ли какие-нибудь альтернативы такого подхода.

Как вы рекомендуете разрабатывать и внедрять систему плагинов/фабрику, как я только что описал?

+0

Можете ли вы объяснить немного больше о том, как вы собираетесь управлять созданием объектов с вашего завода? В нашем плагине мы имеем обширную конфигурационную файловую систему, которая описывает, как должны быть загружены объекты и иерархия объектов. – sep 2008-11-22 13:53:44

ответ

2

Был статью некоторое время назад в Доктор Добба что обсуждал эту точную проблему. Ниже приведена статья a link.

В качестве альтернативы вам может понадобиться прямой интерфейс C для плагинов для вашего проекта. Таким образом, вы можете связать код, написанный практически на любом языке, в вашу инфраструктуру с минимальными проблемами. В то время как C++ хорош, способность использовать больше, чем то, что существует на C++, подобно невероятным фреймворкам, которые существуют на землях Java и Python, может оказаться полезной в долгосрочной перспективе.