Progettazione software basata su plug-in

8

Sono uno sviluppatore di software che è disposto a migliorare le sue capacità di progettazione di software. Penso che il software non dovrebbe funzionare solo, ma avere anche un design solido ed elegante per essere riutilizzabile e estensivo per scopi successivi.

Ora sono in cerca di aiuto per capire le buone pratiche per problemi specifici. In realtà, sto cercando di scoprire come progettare un software che sia estensibile tramite i plug-in.

Le domande che ho sono le seguenti:

  • I plug-in dovrebbero essere in grado di accedere alle altre funzionalità? Ciò porterebbe alle dipendenze, credo.
  • Che cosa dovrebbe offrire l'applicazione principale ai plug-in se voglio, diciamo, sviluppare un software multimediale in grado di riprodurre video e musica, ma che in seguito potrebbe aggiungere funzionalità ai plug-in che direbbero essere in grado di leggere stato del video (tempo, bps, ...) e visualizzarlo. Ciò significherebbe che il giocatore stesso dovrebbe essere parte del programma principale e offrire servizi ai plug-in per ottenere tali informazioni o ci sarebbe un modo per sviluppare il player come plug-in, ma offrire in qualche modo la possibilità ad altri plug-in per interagire con esso?

Come vedi, le mie domande sono principalmente a scopo di apprendimento mentre mi sforzo di migliorare le mie capacità di sviluppo del software.

Spero di trovare aiuto qui e mi scuso se qualcosa non va nella mia domanda.

    
posta gekod 04.09.2012 - 14:48
fonte

1 risposta

12

Praticamente qualsiasi software che "vuole" essere esteso nel tempo, da più contributori che non sono strettamente collegati o coordinati, può trarre beneficio da un plug-in architettura di qualche tipo. Esempi comuni sono i sistemi operativi, strumenti CAD e GIS, strumenti di disegno e manipolazione delle immagini, editor di testo e elaboratori di testi, IDE, browser Web, sistemi di gestione dei contenuti Web e linguaggio di programmazione e framework. I plugin sono il cardine dei sistemi estensibili.

Tipicamente le architetture plug-in utilizzano digitazione anatra . L'architetto definisce un insieme comune di metodi (ad esempio open , close , play , stop , seek , ecc.), Che ciascun plugin implementa (interamente o in parte). Alcuni metodi sono obbligatori, mentre altri possono essere facoltativi o utili solo in casi specifici.

Quando il programma principale viene eseguito inizialmente, controlla una o più "aree plugin" (come le directory ./plugins conosciute) per l'esistenza dei plugin. Quelli trovati sono caricati nel programma.

Spesso i plug-in devono esistere al momento dell'esecuzione del programma principale. Il kernel Unix e il server Web Apache operano tipicamente in questo modo; devono essere riavviati per "vedere" e utilizzare nuovi plugin. I plugin possono essere più dinamici tuttavia; qui il programma principale ricontrolla periodicamente i plugin appena aggiunti o modificati (ad esempio confrontando un timestamp plugins-last-loaded memorizzato con il timestamp "last modified" per una directory plugins). Il programma principale quindi (ri) caricherà i plug-in - tutti o tutti, nel caso semplice / ingenuo, o solo quelli nuovi / modificati, se è più sofisticato.

C'è spesso un requisito di "registrazione", con ogni plugin che non è solo codice, ma include anche alcuni metadati che comunica come il plugin si integra nel tutto. Ad esempio, potrebbe essere richiesto un plugin per lettore musicale per indicare quale tipo di file può riprodurre, quali architetture di processore può essere eseguito, quali risorse ha bisogno (ad esempio, quanta memoria deve essere allocata) e altri attributi necessari per il programma principale per decidere quale plugin utilizzare per riprodurre il file.

I meccanismi per la registrazione dei plugin, il caricamento e l'interazione con il programma principale sono abbastanza specifici per linguaggio e struttura. Perché c'è un sacco di "orchestrazione" in corso, con alcune funzioni gestite dal programma principale e alcuni dai suoi plugin (di cui ce ne potrebbero essere parecchi), l'impostazione di un programma per l'estensibilità richiede attenzione e considerazione e una vista architettonica del programma come "un sistema" piuttosto che "un singolo pezzo di codice".

La maggior parte dei progetti su larga scala avrà già scelto un framework di plugin o progettato proprio. Esistono anche numerosi framework di plugin generici progettati per semplificare la realizzazione del programma in un sistema estensibile.

(Risposta alla domanda 1) Sebbene i plug-in possano utilizzare le rispettive funzionalità, in genere lo fanno attraverso i metodi / API predefiniti che l'architetto ha predisposto. L'uso di tale "digitazione anatra" aiuta a evitare la super-interdipendenza, e significa che non è necessariamente chiaro se una determinata caratteristica sia fornita dal codice "core" o da un plugin. Infatti, avendo adottato una strategia di plug-in, molti sviluppatori implementano anche funzionalità "core" come plug-in, solo quelle che vengono fornite con il programma principale. Mentre avere grovigli di spaghetti di plugin non è l'ideale, non è raro vedere alcuni plug-in che richiedono l'esistenza di altri plug-in.

(Risposta alla domanda 2) Come architetto, la cosa principale che offri plugin è un'architettura - ad es. un insieme di metodi attraverso i quali sono impostati, registrati e invocati, e una progettazione e una serie di requisiti in cui i plug-in opereranno. Il programma principale, durante l'esecuzione, espone di solito molti se non tutte le sue strutture e metodi di dati interni ai plugin. Questa è ovviamente un'esposizione alla sicurezza. Un certo numero di tecniche sandboxing possono essere (e vengono utilizzati sempre più spesso, ma il più delle volte i plugin sono codice "fidato", che funziona come se fanno parte del programma principale.

Per ulteriori informazioni:

risposta data 04.09.2012 - 20:15
fonte

Leggi altre domande sui tag