Domanda

C'è una procedura generale per la programmazione estensibilità capacità nel codice?

Mi chiedo che cosa la procedura generale per l'aggiunta di estensione-tipo di capacità di un sistema di scrittura in modo che le funzionalità possono essere estese attraverso un qualche tipo di plugin API piuttosto che dover modificare il codice di base di un sistema.

Fare queste cose tendono ad essere dipendente dalla lingua che il sistema è stato scritto, o c'è un metodo generale per consentire questo?

È stato utile?

Soluzione

In generale, questo è qualcosa che si dovrà esporsi, quindi sì, è dipendente della lingua di sistema è scritto in (anche se spesso è possibile scrivere wrapper per le altre lingue).

Se, per esempio, un programma scritto in C, per Windows, plugin sarebbe scritto per il vostro programma di Dll.In fase di esecuzione, si dovrebbe caricare manualmente queste Dll, e di esporre alcune alla loro interfaccia.Per esempio, Dll potrebbe esporre un gimme_the_interface() funzione che potrebbe accettare una struttura riempito con i puntatori a funzione.Questi puntatori a funzione consentirebbe la DLL per effettuare chiamate, registro chiamate ripetute, etc.

Se siete stati in C++, è possibile utilizzare DLL di sistema, tranne che si sarebbe probabilmente passare un puntatore all'oggetto invece di una struct, e l'oggetto di implementare un'interfaccia che ha fornito la funzionalità (compiendo la stessa cosa della struct, ma meno brutto).Per Java, sarebbe necessario caricare i file di classe on-demand, invece di Dll, ma l'idea di base dovrebbe essere la stessa.

In tutti i casi, è necessario definire uno standard di interfaccia tra il codice e il plugin, in modo che è possibile inizializzare il plugin, e quindi il plugin in grado di interagire con voi.

P. S.Se vuoi vedere un buon esempio di C++ sistema di plug-in, check out il foobar2000 SDK.Non ho usato un po', ma è usato per essere davvero ben fatto.Presumo che lo è ancora.

Altri suggerimenti

Ho usato evento a base di Api per i plugin in passato.È possibile inserire i ganci per il plugin, l'invio di eventi e di fornire l'accesso all'applicazione dello stato.

Per esempio, se si stesse scrivendo un applicazione di blogging, si potrebbe desiderare di generare un evento appena prima di un nuovo post viene salvato nel database, e di fornire il post HTML per il plugin di modificare come necessario.

Sono tentato di punto per la Progettazione di Modelli di libro per questa domanda generica :p

Seriamente, penso che la risposta è no.Non è possibile scrivere estensibile codice per impostazione predefinita, sarà difficile creare/ampliare e terribilmente inefficiente (Mozilla ha iniziato con l'idea di essere molto flessibile, utilizzato XPCOM ovunque, e ora si sono resi conto dell'errore e ha iniziato a rimuovere cui non ha senso).

ciò che ha senso fare è quello di identificare le parti del sistema che può essere significativamente estesa e a supporto di una corretta API per questi casi (ad es.supporto per la lingua plugin in un editor).Devi utilizzare i modelli pertinenti, ma l'implementazione specifica dipende dalla vostra piattaforma/scelta della lingua.

IMO, aiuta, inoltre, a utilizzare un linguaggio dinamico che consente di modificare il codice di base in fase di esecuzione (quando è assolutamente necessario).Ho apprezzato il fatto che Mozilla estensibilità funziona in questo modo, durante la scrittura di estensioni di Firefox.

Penso che ci sono due aspetti alla tua domanda:

La progettazione del sistema per essere estendibile (design pattern, inversion of control e altri aspetti architettonici) (http://www.martinfowler.com/articles/injection.html).E, almeno per me, sì, questi modelli/tecniche/piattaforma indipendente dalla lingua e può essere visto come una "procedura generale".

Ora, la loro attuazione è la lingua e la piattaforma dependend (per esempio in C/C++ hai la libreria dinamica roba, etc.)

A 'quadri' sono stati sviluppati per fornire un ambiente di programmazione che fornisce pluggability/estensibilità, ma come altre persone parlare, non essere troppo pazzo, il tutto collegabile.

Nel mondo Java un buon specifica a guardare, è OSGi (http://en.wikipedia.org/wiki/OSGi) con varie implementazioni, il migliore IMHO essere Equinozio (http://www.eclipse.org/equinox/)

  1. Scoprire che cosa minima documenti necessari che si desidera mettere su un plugin scrittore.Poi fare una o più Interfacce che lo scrittore deve implementare il codice per sapere quando e dove eseguire il codice.

  2. Fare un API lo scrittore può utilizzare per accedere ad alcune funzionalità di codice.

Si potrebbe anche fare una classe di base, lo scrittore deve ereditare.Questo renderà il cablaggio API più facile.Quindi utilizzare un qualche tipo di riflessione per eseguire la scansione di una directory, e caricare le classi si scopre che soddisfa le vostre esigenze.

Alcune persone anche fare un linguaggio di scripting per il loro sistema, o implementa un interprete per un sottoinsieme di una lingua esistente.Questo è anche un possibile percorso per andare.

Linea di fondo è:Quando si ottiene il codice per caricare, solo la tua immaginazione dovrebbe essere in grado di fermarti.
Buona fortuna.

Se si utilizza un linguaggio compilato come C o C++, potrebbe essere una buona idea di guardare a supporto dei plugin tramite linguaggi di scripting.Sia e Python, Lua sono eccellenti lingue che vengono utilizzati per lo script di un gran numero di applicazioni (Civ4 e blender usare Python, Comandante Supremo utilizza Lua, ecc).

Se si utilizza C++, check out il boost libreria python.In caso contrario, python navi con le intestazioni che possono essere utilizzati in C, e fa un ottimo lavoro di documentare il C/python API.La documentazione sembrava meno completo per Lua, ma non può essere stato in cerca abbastanza duro.In ogni modo, è in grado di offrire una struttura abbastanza solida piattaforma di script senza una terribile quantità di lavoro.Non è comunque banale, ma fornisce una buona base su cui lavorare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top