Pergunta

Existe um procedimento geral para programar capacidade de extensibilidade em seu código?

Estou me perguntando qual é o procedimento geral para adicionar capacidade de tipo de extensão a um sistema que você está escrevendo, para que a funcionalidade possa ser estendida por meio de algum tipo de API de plug-in, em vez de ter que modificar o código principal de um sistema.

Essas coisas tendem a depender do idioma em que o sistema foi escrito ou existe um método geral para permitir isso?

Foi útil?

Solução

Geralmente, isso é algo que você mesmo terá que expor. Então, sim, dependerá da linguagem em que seu sistema está escrito (embora muitas vezes também seja possível escrever wrappers para outras linguagens).

Se, por exemplo, você tivesse um programa escrito em C, para Windows, os plug-ins seriam escritos para o seu programa como DLLs.Em tempo de execução, você carregaria manualmente essas DLLs e exporia alguma interface a elas.Por exemplo, as DLLs podem expor um gimme_the_interface() função que poderia aceitar uma estrutura preenchida com ponteiros de função.Esses ponteiros de função permitiriam que a DLL fizesse chamadas, registrasse retornos de chamada, etc.

Se você estivesse em C++, usaria o sistema DLL, exceto que provavelmente passaria um ponteiro de objeto em vez de uma estrutura, e o objeto implementaria uma interface que fornecesse funcionalidade (realizando a mesma coisa que a estrutura, mas menos feia).Para Java, você carregaria arquivos de classe sob demanda em vez de DLLs, mas a ideia básica seria a mesma.

Em todos os casos, você precisará definir uma interface padrão entre seu código e os plug-ins, para que possa inicializar os plug-ins e para que eles possam interagir com você.

P.S.Se você quiser ver um bom exemplo de sistema de plugins C++, confira o SDK foobar2000.Faz um bom tempo que não uso, mas costumava ser muito bem feito.Presumo que ainda seja.

Outras dicas

Já usei APIs baseadas em eventos para plug-ins no passado.Você pode inserir ganchos para plug-ins despachando eventos e fornecendo acesso ao estado do aplicativo.

Por exemplo, se você estava escrevendo um aplicativo de blog, você pode querer gerar um evento logo antes de uma nova postagem ser salva no banco de dados e fornecer o HTML da postagem para o plug-in alterar conforme necessário.

Estou tentado a indicar o livro Design Patterns para esta pergunta genérica: p

Sério, acho que a resposta é não.Você não pode escrever código extensível por padrão, será difícil escrever/estender e terrivelmente ineficiente (a Mozilla começou com a ideia de ser muito extensível, usava XPCOM em todos os lugares, e agora eles perceberam que era um erro e começaram a removê-lo onde não faz sentido).

o que faz sentido é identificar as partes do seu sistema que podem ser estendidas de forma significativa e oferecer suporte a uma API adequada para esses casos (por exemplo,plug-ins de suporte a idiomas em um editor).Você usaria os padrões relevantes, mas a implementação específica depende da sua escolha de plataforma/linguagem.

IMO, também ajuda a usar uma linguagem dinâmica - torna possível ajustar o código principal em tempo de execução (quando for absolutamente necessário).Apreciei que a extensibilidade do Mozilla funciona dessa maneira ao escrever extensões do Firefox.

Acho que há dois aspectos em sua pergunta:

O projeto do sistema deve ser extensível (os padrões de projeto, inversão de controle e outros aspectos arquitetônicos) (http://www.martinfowler.com/articles/injection.html).E, pelo menos para mim, sim, esses padrões/técnicas são independentes de plataforma/linguagem e podem ser vistos como um "procedimento geral".

Agora, sua implementação depende da linguagem e da plataforma (por exemplo, em C/C++ você tem o material da biblioteca dinâmica, etc.)

Vários 'frameworks' foram desenvolvidos para fornecer um ambiente de programação que fornece capacidade de conexão/extensibilidade, mas como algumas outras pessoas mencionaram, não fique muito louco tornando tudo conectável.

No mundo Java, uma boa especificação a ser observada é OSGi (http://en.wikipedia.org/wiki/OSGi) com várias implementações, a melhor IMHO sendo Equinox (http://www.eclipse.org/equinox/)

  1. Descubra quais requisitos mínimos você deseja impor a um criador de plugins.Em seguida, faça uma ou mais Interfaces que o escritor deve implementar para que seu código saiba quando e onde executar o código.

  2. Faça uma API que o escritor possa usar para acessar algumas das funcionalidades do seu código.

Você também pode criar uma classe base que o escritor deve herdar.Isso tornará a conexão da API mais fácil.Em seguida, use algum tipo de reflexão para varrer um diretório e carregar as classes que você encontrar que correspondam aos seus requisitos.

Algumas pessoas também criam uma linguagem de script para seus sistemas ou implementam um interpretador para um subconjunto de uma linguagem existente.Este também é um caminho possível a seguir.

Resumindo:Quando você carrega o código, apenas sua imaginação deve ser capaz de impedi-lo.
Boa sorte.

Se você estiver usando uma linguagem compilada como C ou C++, pode ser uma boa ideia verificar o suporte a plug-ins por meio de linguagens de script.Tanto Python quanto Lua são linguagens excelentes usadas para criar scripts de um grande número de aplicativos (Civ4 e Blender usam Python, Supreme Commander usa Lua, etc).

Se você estiver usando C++, verifique a biblioteca boost python.Caso contrário, o python vem com cabeçalhos que podem ser usados ​​em C e faz um bom trabalho documentando a API C/python.A documentação parecia menos completa para Lua, mas talvez eu não tenha procurado o suficiente.De qualquer forma, você pode oferecer uma plataforma de script bastante sólida sem muito trabalho.Ainda não é trivial, mas fornece uma base muito boa para trabalhar.

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