In particolare, voglio supportare "plugin" che modificano il comportamento di parti della libreria.
Non sono riuscito a trovare molte informazioni sul web su questo argomento. Ma ecco le mie idee su come una libreria potrebbe essere estensibile.
-
La libreria esporta un oggetto con funzioni sia pubbliche che "protette". Un plugin può sostituire qualsiasi di queste funzioni, modificando così il comportamento della libreria. I vantaggi di questo metodo sono che è semplice e che le funzioni del plugin possono avere pieno accesso alle funzioni "protette" della libreria. Gli svantaggi sono che la libreria potrebbe essere più difficile da mantenere con un set più ampio di funzioni esposte e potrebbe essere difficile eseguire il debug se sono coinvolti più plugin (come sapere quale plugin ha modificato quale funzione?).
-
La libreria fornisce una funzione "aggiungi plugin" che accetta un oggetto con un'interfaccia specifica. Internamente, la libreria utilizzerà il plug-in al posto del proprio codice, se appropriato. Con questo metodo, gli interni della libreria possono essere riorganizzati più liberamente purché supporti ancora la stessa interfaccia di plugin. Ciò potrebbe anche supportare l'uso di interfacce plugin diverse per modificare diverse parti della libreria. Uno svantaggio di questo metodo è che i plugin potrebbero dover implementare nuovamente il codice che è già parte della libreria poiché le funzioni interne della libreria non vengono esportate.
-
La libreria fornisce una funzione "imposta implementazione" che accetta un oggetto ereditato da un oggetto base specifico. L'API pubblica della libreria chiama le funzioni nell'oggetto di implementazione per qualsiasi funzionalità che può essere modificata e l'oggetto di implementazione di base include la funzionalità di base, con funzioni esterne (all'API) e interne. Un plugin crea un nuovo oggetto di implementazione, che eredita dall'oggetto base e sostituisce qualsiasi funzione che desidera modificare. Questo combina vantaggi e svantaggi di entrambi gli altri metodi.