Изменение поведения по умолчанию в приложении C ++ с помощью плагинов [закрыто]

StackOverflow https://stackoverflow.com/questions/311247

  •  10-07-2019
  •  | 
  •  

Вопрос

Вкратце: как лучше всего спроектировать и реализовать механизм фабрики + плагинов, чтобы плагины могли заменять объекты в основном приложении.

У нас есть кодовая база, из которой мы строим наши приложения. Кодовая база подходит для 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top