Alterando comportamento predefinido numa aplicação C ++ com encaixes [fechado]

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

  •  10-07-2019
  •  | 
  •  

Pergunta

Em resumo:. O que é a melhor maneira de projetar e implementar um mecanismo + plugin de fábrica, de modo que plugins pode substituir objetos no aplicativo principal

Nós temos uma base de código a partir do qual podemos construir nossas aplicações. A base de código é bom para 70-95% dos pedidos, o que significa que em cada nova aplicação que precisamos mudar 5-30% do comportamento padrão (adicionar novos recursos, a lógica padrão alterar, adicionar GUI, etc.).

A implementação é plugin-base: a base de código é construído em um EXE e DLLs, e quando o EXE principal está em execução que carregar uma DLL que adiciona a funcionalidade necessária

.

Actualmente, cada plug-in expõe a seguinte função:

PluginInterface* PluginInit()
{
    return new MyCustomizedPluginInterface();
}

Onde PluginInterface é definido como:

class PluginInterface {
public:
    virtual SomeClass1* customizedSomeClass1() = 0;
    virtual SomeClass2* customizedSomeClass2() = 0;
};

E SomeClass1 / SomeClass2 ter algum comportamento padrão, mas pode ser substituído e mudado pelo plugin.

A implementação atual torna difícil para a adição de novas classes personalizadas. Nós gostaríamos de substituir todas as classes na aplicação principal do plugin, por isso faz sentido para as fábricas uso de objetos.

One SDK que eu conheço usa a seguinte técnica:

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

Gostaria de saber se existem alternativas a esta abordagem.

Como você recomendaria concepção e implementação de um sistema de plugins / fábrica como eu acabei de descrever?

Foi útil?

Solução

Houve um artigo um tempo atrás em Doctor Dobb do que discutiu este problema exato. Aqui está um link para o artigo em questão.

Como um aparte você pode querer ficar com uma interface de linha reta C para os plugins para o seu projeto. Dessa forma, você pode ligar o código escrito em praticamente qualquer idioma em seu quadro com o mínimo de confusão. Enquanto C ++ é bom, ser capaz de alavancagem mais do que o que existe em C ++, como os quadros incríveis que existem em terras Java e Python, poderia ser benéfico a longo prazo.

Outras dicas

Será que você olha para exemplos codeproject para os quadros plugins? https://secure.codeproject.com/KB/DLL/plugin.aspx http://www.codeproject.com/KB/library/dynobj.aspx

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top