it-swarm.dev

Come progettare un software estensibile (architettura plugin)?

Ho bisogno di alcune risorse che parlano di come progettare il tuo software per essere estensibile, cioè che altre persone possano scrivere componenti aggiuntivi/plug-in che aggiungano funzionalità ad esso.

Che cosa mi consiglia? Qualche libro là fuori che discute l'argomento?
Preferirei qualcosa che sia breve e diretto; un po 'di teoria e un mucchio di esempi concreti.

Non sto prendendo di mira una lingua specifica, voglio essere in grado di comprendere l'idea di base in modo da poterla implementare in qualsiasi lingua. 

E per lo stesso motivo, preferisco non farlo usando un framework creato da qualcun altro (a meno che il framework non sia molto di alto livello, cioè non nasconda too molto), al momento voglio solo educarmi sull'argomento e sperimentare vari modi per implementarlo. Inoltre, un framework solitamente presuppone che l'utente conosca l'argomento.

AGGIORNARE

Non sto chiedendo di OOP o di permettere che le mie classi vengano ereditate. Sto parlando della progettazione di un'applicazione che verrà distribuita su un sistema, in modo che possa essere estesa da componenti aggiuntivi di terze parti dopo che è stata distribuita.

Ad esempio, Notepad ++ ha un'architettura plug-in dove puoi inserire un file .dll nella cartella plugins e aggiunge funzionalità all'applicazione che non c'era, come color-picking, o inserimento di snippet, o molte altre cose (una vasta gamma di funzionalità).

67
hasen
24
bugmagnet

Implementa SOLIDI principi nella tua applicazione.

1. Principio della singola responsabilità: Una classe dovrebbe avere una sola responsabilità (cioè solo un potenziale cambiamento nelle specifiche del software dovrebbe essere in grado di influenzare le specifiche della classe

2.Open/principio di chiusura: Le entità software ... dovrebbero essere aperte per l'estensione, ma chiuse per la modifica

3. Principio di sostituzione di Liskov: Gli oggetti in un programma dovrebbero essere sostituibili con istanze dei loro sottotipi senza alterare la correttezza di quel programma

4. Principio di segregazione dell'interfaccia: Molte interfacce specifiche del client sono migliori di un'interfaccia generica

5. Principio di inversione delle dipendenze: _ ​​Uno dovrebbe dipendere dalle astrazioni. Non dipendere dalle concrezioni

Domande StackOverflow:

Esempio di principio di responsabilità singola

Il principio aperto/chiuso è una buona idea?

Qual è il Principio di sostituzione di Liskov?

Interfaccia Segregation Principle - Programma su un'interfaccia

Qual è il principio di inversione delle dipendenze e perché è importante?

4
Ravindra babu

Cerchi di raggiungere due obiettivi in ​​competizione:

  1. I componenti del software devono esporre molto di se stessi, in modo che possano essere riutilizzati
  2. I componenti del software devono esporre molto poco di se stessi, in modo che possano essere riutilizzati

Spiegazione: Per incoraggiare il riutilizzo del codice, dovresti essere in grado di estendere le classi esistenti e chiamare i loro metodi. Questo non è possibile quando i metodi sono dichiarati "privati" e le classi sono "finali" (e non possono essere estese). Quindi per raggiungere questo obiettivo, tutto dovrebbe essere pubblico e accessibile. Nessun dato o metodo privato.

Quando rilasci la seconda versione del tuo software, scoprirai che molte delle idee della versione 1 erano chiaramente sbagliate. È necessario modificare molte interfacce o il codice, i nomi dei metodi, eliminare i metodi, interrompere l'API. Se lo fai, molte persone si allontaneranno. Quindi, per essere in grado di evolvere il tuo software, i componenti non devono esporre nulla che non sia assolutamente necessario, al costo del riutilizzo del codice.

Esempio: volevo osservare la posizione del cursore (caret) in un SWT StyledText. Il caret non è pensato per essere esteso. Se lo fai, scoprirai che il codice contiene verifiche come "questa è la classe nel pacchetto org.Eclipse.swt" e molti metodi sono privati, finali e quant'altro. Ho dovuto copiare circa 28 classi di SWT nel mio progetto solo per implementare questa funzione perché tutto è bloccato.

SWT è una struttura piacevole da usare e un inferno da estendere.

4
Aaron Digulla

Ovviamente c'è il famoso principio Open Closed - http://en.wikipedia.org/wiki/Open/closed_principle

3
LenW

Beh, dipende dalla lingua. 

  • In C/C++ sono abbastanza sicuro che esista una funzione loadlibrary che consente di aprire una libreria in fase di esecuzione e richiamare le sue funzioni esportate. Questo è in genere come è fatto in C/C++.
  • In .NET, c'è Reflection, che offre offerte simili (ma più ampie) a loadlibrary. Ci sono anche intere librerie basate su Reflection come Managed Extension Framework o Mono.Addins che fa già la maggior parte del lavoro pesante.
  • In Java, c'è anche Reflection. E c'è il JPF (Java Plugin Framework) che viene utilizzato in cose come Eclipse IIRC.

A seconda della lingua che utilizzi, potrei raccomandare alcuni tutorial/libri. Spero che questo sia stato utile.

2
joemoe

L'articolo Scrivere applicazioni basate su plugin spiega chiaramente le responsabilità delle varie parti dell'architettura usando un esempio molto semplice; il codice sorgente è fornito (VB.Net). L'ho trovato molto utile per capire i concetti di base.

1
Tom Juergens

Dal momento che non ho abbastanza punti Rep per lasciare un commento, lo sto postando come risposta. SharpDevelop è un IDE per lo sviluppo di applicazioni in C #/VB.NET/Boo. Ha un'architettura piuttosto impressionante che si lascia estendere in diversi modi: dalle nuove voci di menu al supporto per lo sviluppo di lingue completamente nuove.

Usa un po 'di configurazione XML per fungere da strato di colla tra un nucleo di IDE e l'implementazione del plugin. Gestisce l'individuazione, il caricamento e il controllo delle versioni dei plug-in fuori dalla scatola. La distribuzione di nuovi plug-in è una questione di semplice copia nel nuovo file di configurazione xml e negli assembly richiesti (DLL) e nel riavvio dell'applicazione. Potete leggere di più su questo nel libro "Dissecting a csharp application" dell'autore/i originale/i - Christian Holm, Mike Krüger, Bernhard Spuida dell'applicazione da here . Il libro non sembra essere disponibile su quel sito, ma ho trovato una copia che potrebbe ancora essere in giro qui

Trovato anche una domanda correlata qui

0
Shreyas Murali

Se lavori con .Net, la nostra ricerca ha prodotto due approcci: scripting e composizione.

Scripting

Estendi la funzionalità di ciò che le tue classi possono fare orchestrandole usando gli script. Ciò significa esporre ciò che è compilato nella tua lingua .Net preferita in un linguaggio dinamico.

Alcune opzioni che abbiamo trovato vale la pena esplorare:

Composizione

Se si avvia un progetto con .Net 4 o successivo, è necessario dare un'occhiata al Managed Extensibility Framework (MEF). Ti consente di estendere la funzionalità delle tue app in modo plug-in.

Il Managed Extensibility Framework (MEF) è un livello di composizione per .NET che migliora la flessibilità, la manutenibilità e la testabilità di grandi applicazioni. MEF può essere utilizzato per plug-in di terze parti estensibilità, o può portare i benefici di un accoppiamento liberamente architettura a forma di plugin per applicazioni regolari.

Framework add-in gestito è anche una buona lettura. 

0
Ricardo

L'architettura dei plugin sta diventando molto popolare per la sua estensibilità e quindi la flessibilità.

Per c ++, il server httpd di Apache è in realtà basato su plugin, ma al suo posto viene utilizzato un concetto di modulo. La maggior parte delle funzionalità di Apache sono implementate come moduli, come cache, riscrittura, bilanciamento del carico e persino modello di threading. È un software molto modulare che abbia mai visto.

E per Java, Eclipse è decisamente basato su plugin. Il nucleo di Eclipse è un sistema di moduli OSGI che gestisce i bundle, un altro concetto per i plugin. Bundle può fornire punti di estensione su cui possiamo costruire moduli con meno sforzi. La cosa più complessa in OSGI è la sua caratteristica dinamica, il che significa che i pacchetti possono essere installati o disinstallati in fase di runtime. Non c'è più la sindrome di stop-the-world!

0
yanky

Checkout "CAB" - Microsoft's Composition Application Building Blocchi Framework . Penso che abbiano anche una "versione web" di questo ...

0
Thomas Hansen

Ho appena iniziato a sviluppare un'applicazione client intelligente. Queste sono due opzioni che sto considerando.

Utilizzando Microsoft System.AddIn namespace. Sembra molto promettente, tuttavia potrebbe essere un po 'complesso per la nostra soluzione finale.

Oppure lo Smart Client - Blocco interfaccia utente composito di Microsoft

Recentemente, ho cercato di prendere i componenti sia del blocco di applicazioni dell'interfaccia utente composito sia dello spazio dei nomi System.AddIn per creare il mio. Poiché il codice sorgente è disponibile per il CAB, è facile estenderlo. Penso che la nostra soluzione finale sarà una versione leggera del CAB, utilizzando sicuramente il Unity Application Block

0
Rohan West