Pergunta

Eu preciso de alguns recursos que falam sobre como projetar seu software para ser extensível, ou seja, para que outras pessoas podem escrever add-ons / plug-ins que adiciona funcionalidade a ele.

O que você recomenda? Todos os livros lá fora, que discutir o assunto?
Eu preferiria algo que é curto e direto ao ponto; um pouco de teoria e um monte de exemplos concretos.

Eu não sou alvo um idioma específico, eu quero ser capaz de entender a idéia central para que eu possa implementá-lo em qualquer idioma.

E, pela mesma razão, eu prefiro não fazê-lo usando um quadro que alguém construiu (a menos que o quadro não é muito alto nível, ou seja, não esconde muito muito), em no momento eu só quero me educar sobre o assunto e experimentar várias maneiras de implementá-lo. Além disso, um quadro geralmente assume o conhecimento do usuário sobre o assunto.

Atualizar

Eu não estou perguntando sobre OOP ou permitir que minhas aulas para ser herdada. Eu estou falando sobre a criação de um aplicativo que será implantado em um sistema, de tal forma que ele pode ser estendido por terceiros add-ons APÓS sua sido implantado.

Por exemplo, Notepad ++ tem uma arquitetura plug-in onde você pode colocar um arquivo .dll na pasta plugins, e adiciona funcionalidade para o aplicativo que não estava lá, como cor-picking, ou fragmento de inserção, ou muitas outras coisas (uma ampla gama de funcionalidades).

Outras dicas

OSGI é um bom exemplo prático de uma estrutura técnica que permite fazer o que você está depois.

O href="http://www.osgi.org/Main/HomePage" teoria é aqui .

O (grátis!) Livro está lá .

extensibilidade ea capacidade de gravação plugin deve lidar com ciclo de vida do serviço

  • adição / remoção de serviço / plugin no local
  • gerenciamento de dependências entre os serviços
  • gestão de estados de serviços (declarada, instalado, iniciado, parado, ...)

O que é OSGI para?

Uma das principais funções de um módulo é como uma unidade de implantação ... algo que podemos construir ou baixar e instalar para estender a funcionalidade da nossa aplicação.

Você vai encontrar um href="http://www.osgi.org/blog/2008/08/why-services-are-important.html" rel="noreferrer"> introdução , na noção central da serviço (que está relacionado à sua pergunta, e que explicam alguns problemas em torno serviços, componente chave para extensibilidade).

Extract:

Por que os serviços, então, tão importante se muitas aplicações podem ser construídas sem eles? Bem, os serviços são a melhor maneira conhecida para componentes de software dissociar um do outro.

Um dos aspectos mais importantes dos serviços é que eles minimizar significativamente os problemas de carregamento de classes, porque eles trabalham com instâncias de objetos, não com nomes de classe. Instâncias que são criados pelo provedor, não o consumidor. A redução da complexidade é bastante surpreendente

Não só os serviços minimizar configuração, eles também reduzem significativamente o número de pacotes compartilhados.

Você tenta alcançar dois objetivos concorrentes:

  1. Os componentes do seu software deve expor muito de si mesmos, para que possam ser reutilizados
  2. Os componentes do seu software deve expor muito pouco de si mesmos, para que possam ser reutilizados

Explicação: Para incentivar a reutilização de código, você deve ser capaz de estender as classes existentes e chamar seus métodos. Isso não é possível quando os métodos são declarados "privado" e as classes são "final" (e não pode ser estendido). Então, para atingir esse objetivo, tudo deve ser público e acessível. Não existem dados privada ou métodos.

Quando você soltar a segunda versão do seu software, você vai descobrir que muitas das idéias da versão 1 estavam errados simples. Você precisa mudar muitas interfaces ou seu código, nomes de métodos, métodos de exclusão, quebrar a API. Se você fizer isso, muitas pessoas vão se virar. Portanto, a fim de ser capaz de evoluir seu software, os componentes não deve expor nada que não seja absolutamente necessário -. Ao custo de reutilização de código

Exemplo: queria observar a posição do cursor (cursor) num StyledText SWT. O acento circunflexo não se destina a ser prorrogado. Se você fizer isso, você verá que o código contém cheques como "é esta classe na org.eclipse.swt pacote" e um monte de métodos são privados e final e outros enfeites. Eu tive que copiar cerca de 28 aulas fora do SWT no meu projeto apenas para implementar este recurso porque tudo é bloqueado.

SWT é uma boa estrutura para uso e inferno para ampliar.

princípios sólidas em sua aplicação.

1. princípio da responsabilidade única: A classe deve ter apenas uma única responsabilidade (ou seja, apenas uma mudança potencial na especificação do software deve ser capaz de afetar a especificação da classe

princípio 2.Open/closed: entidades de software ... deve ser aberto para extensão, mas fechado para modificação

3. princípio da substituição Liskov: Objetos em um programa deve ser substituível com instâncias de seus subtipos sem alterar a correção desse programa

4. princípio da segregação Interface: muitas interfaces específicas do cliente são melhores do que um general-purpose da interface

5. princípio de inversão de dependência: Um deve depender Abstrações . Não dependa de concreções

perguntas StackOverflow:

Exemplo de responsabilidade única Princípio

o / Princípio Aberto Fechado é uma boa idéia?

Qual é a substituição de Liskov?

Program Interface Principle- Segregação a uma interface

Qual é a inversão de dependência Princípio e por que é importante?

Claro que há o famoso Abrir Princípio fechado - http://en.wikipedia.org / wiki / Open / closed_principle

Bem, depende do idioma.

  • Em C / C ++ Eu tenho certeza que há uma função LoadLibrary que lhe permite abrir uma biblioteca em tempo de execução e chamar ele está funções exportadas. Isto é tipicamente como é feito em C / C ++.
  • Em .NET, há reflexão, que é ofertas semelhantes (mas mais largos) para LoadLibrary. Há também bibliotecas inteiras construídas em reflexão como quadro de extensão gerenciado ou Mono.Addins que faz a maior parte do trabalho pesado para você já.
  • Em Java, há também Reflexão. E há a JPF (Java Plugin Framework), que é usado em coisas como Eclipse IIRC.

Dependendo do que linguagem que você usa eu poderia recomendar alguns tutoriais / livros. Espero que este foi útil.

O artigo Escrita Plugin baseados explica claramente o responsabilidades das várias partes da arquitetura usando um exemplo muito simples; código fonte é fornecido (VB.Net). Achei muito útil na compreensão dos conceitos básicos.

Checkout "CAB" - Microsoft de Composição Blocos Application Framework . Eu acho que eles têm uma "versão web" de que também ...

Eu apenas comecei a desenvolver um aplicativo cliente inteligente. Estas são duas opções que eu estou considerando.

Usando da Microsoft System.AddIn namespace. Parece muito promissor, no entanto, pode ser um pouco complexo para nossa solução final.

Ou o Smart Client - Composite UI Application Block da Microsoft

Recentemente, eu olhei para tomar componentes tanto o Composite UI Application Block eo namespace System.AddIn para construir minha própria. Desde código fonte está disponível para o CAB é fácil de estender. Eu acho que a nossa solução final será uma versão leve do CAB, definitivamente usando o Unity Application Block

Plugin arquitetura está se tornando muito popular para a sua extensibilidade e, assim, flexibilidade.

Para c ++, o servidor httpd Apache é realmente plug-in baseado, mas um conceito de módulo é usado em seu lugar. A maioria dos apache recursos são implementados como módulos, como cache, reescrita, balanceamento de carga, e até mesmo modelo de segmento. É um software muito modular que já vi.

E para Java, Eclipse é definitivamente plug-in baseado. O núcleo de Eclipse é um sistema de módulo OSGI que gerem feixes, um outro conceito para encaixe. Bundle pode fornecer pontos de extensão sobre a qual podemos construir módulos com menos esforços. A coisa mais complexa em OSGI é sua característica dinâmica, o que significa que pacotes podem ser instalados ou desinstalados durante a execução. Sem síndrome de stop-the-world mais!

Se você trabalha com .Net, nossa pesquisa rendeu duas abordagens: scripting e composição

.

Scripting

Você estender a funcionalidade do que suas aulas pode fazer por orquestrar-los usando scripts. Isso significa expor o que é compilado na sua língua .Net favorito em uma linguagem dinâmica.

Algumas opções encontramos a pena explorar:

Composição

Se você começar um projeto com .Net 4 ou acima, você deve dar uma boa olhada no quadro de extensibilidade gerenciado (MEF). Ele permite que você estender a funcionalidade de seus aplicativos de uma forma plugin.

A extensibilidade Quadro Controlados (FAE) é uma camada de composição de NET que melhora a flexibilidade, a capacidade de teste e capacidade de manutenção de grandes aplicações. MEF pode ser usado para plug-in de terceiros extensibilidade, ou ele pode trazer os benefícios de um fracamente acoplado plugin-como arquitetura para aplicações regulares.

Managed Add-in Framework também é uma boa leitura.

Uma vez que eu não tenho pontos rep suficiente para deixar um comentário, estou postando isso como uma resposta. SharpDevelop é um IDE para desenvolvimento de aplicações em C # / VB.NET / Boo. Ele tem uma arquitetura impressionante que se permite ser estendida em uma série de maneiras -. Certas de novos itens de menu para o apoio ao desenvolvimento de novas inteiras línguas

Ele usa um pouco de configuração XML para actuar como uma camada de cola entre um núcleo de IDE e a implementação de encaixe. Ele lida com a localização, carga e controle de versão de plug-ins fora da caixa. Implantação de novos plugins é questão de simplesmente copiar o novo arquivo de configuração XML e os conjuntos necessários (DLLs) e reiniciar o aplicativo. Você pode ler mais sobre isso no livro "Dissecando uma aplicação csharp" pelo autor original (s) - Christian Holm, Mike Krüger, Bernhard Spuida da aplicação de aqui . O does not book parece estar disponível nesse site, mas eu achei uma cópia que ainda pode estar em torno aqui

Também encontrou uma pergunta relacionada aqui

Ao invés de re-inventar a roda, utilizar as estruturas em mão. Eclipse e Netbeans tanto suporte plug-in extensões baseadas. Você tem que trabalhar em Java embora.

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