Che tipo di problemi hai incontrato durante la creazione di interfacce plugin per la tua applicazione? E come li hai risolti?
Sfondo
Voglio rifattorizzare un'applicazione in modo che le varie funzionalità possano essere spostate nei plug-in, consentendone l'aggiunta e la rimozione in futuro.
Spero che questo sia un sistema più ordinario rispetto allo scattering di if (FeatureX_is_enabled)
rami in tutto il codice. (Potrei sbagliarmi!) Credo che avrò bisogno di definire le interfacce per ogni parte del sistema in cui una funzionalità potrebbe collegarsi.
Vorrei beneficiare della tua esperienza se hai già intrapreso questo tipo di progetto. Forse hai sopportato disegni errati e puoi consigliare ciò che non fare. Forse puoi consigliare modelli o architetture che possono rendere più gestibile un sistema del genere.
Preoccupazioni
Alcuni problemi ci vengono in mente:
- Avrò bisogno di fornire energia ai plugin in modo che possano svolgere il loro lavoro. Se passo troppo poco controllo, i nuovi plugin potrebbero essere troppo limitati per fare ciò di cui hanno bisogno (ad esempio, alcuni autori di estensioni di Google Chrome lamentano l'impossibilità di modificare l'interfaccia principale). Tuttavia, se passo troppo controllo, i plug-in irresponsabili avranno il potere di interrompere l'intera applicazione (ad esempio le estensioni di Mozilla Firefox).
- Alcuni plugin potrebbero dover essere eseguiti in un ordine diverso su eventi diversi. Potrei registrare i gestori di eventi con una priorità, ad es. 1-100, in modo che i plugin possano collegarsi nell'ordine appropriato. Oppure potrei semplicemente creare
post_
epre_
eventi e spero che non sia necessario nulla di più finemente granuloso. - Se due plug-in dipendono da un altro plug-in prima di essere disponibile, l'architettura del plug-in richiederà un qualche tipo di sistema di dipendenza (e denominazione).
- Relativo, alcuni plug-in dovranno sapere quando altri plug-in sono presenti e forse anche effettuare chiamate reciproche per gestire casi limite.
- Potrebbero esserci difficoltà mantenere lo stato dell'applicazione se i plug-in sono abilitati e disabilitati in runtime . (Chrome sembra gestirlo bene, ma molte applicazioni richiedono un riavvio.)
- Questo tipo di architettura neutralizzerà il flusso di esecuzione (in cambio di mantenere un comportamento aggiuntivo fuori dal codice principale). Avrò bisogno di scrivere interfacce pulite in modo tale che il comportamento imprevisto sia ridotto al minimo.
- A volte l'approccio al monolite
if (FeatureX_is_enabled)
potrebbe essere un modo migliore per gestire la situazione piuttosto che scoppiare in un plug-in, ma non so come riconoscere tali situazioni.
È probabile che ci siano altre preoccupazioni che non ho considerato, quindi mi piacerebbe sapere cosa hai avuto a che fare con!
correlati
Domanda correlata: Come attivare / disattivare i moduli di codice?
Libreria correlata: libreria Flow di JavaScript di Bemson per Javascript sembra fornire varie funzionalità per aiutare ad aggiungere e rimuovendo funzionalità da / a un programma in fase di esecuzione, ma ho difficoltà a capirlo!