Prendi in considerazione un'app che consente ai plug-in di reagire al flusso del suo programma.
Conosco 2 modi per raggiungere questo obiettivo: ganci ed eventi
1. Ganci
Utilizzare le chiamate per svuotare le funzioni all'interno del flusso del programma principale. Queste funzioni possono essere sostituite dai plugin.
Ad esempio, Drupal CMS implementa hook disponibili per moduli e temi. Ecco un esempio di come l'hook è implementato in una funzione file_copy .
function file_copy(stdClass $source, $destination = NULL, $replace = FILE_EXISTS_RENAME) {
// ... [File copying routine]
// Inform modules that the file has been copied.
module_invoke_all('file_copy', $file, $source);
return $file;
// ...
}
Un modulo può implementare una modulename_file_copy($file, $source)
funzione che verrà chiamata da module_invoke_all
in file_copy
. Al termine di questa funzione, file_copy
riprenderà l'esecuzione.
2. Eventi
Avere gli eventi di invio dell'app, che possono essere ascoltati dai plugin. Dopo aver ricevuto un evento a cui è stato sottoscritto, un plugin intercetterà il flusso del programma ed eseguirà le operazioni necessarie.
Ad esempio, un plug-in della galleria jQuery Fotorama implementa diversi eventi . Ad esempio, ecco una parte del suo show
metodo che genera l' fotorama:show
evento.
that.show = function (options) {
// ... [show the new frame]
// [fire the event]
options.reset || triggerEvent('show', {
user: options.user,
time: time
});
// ... [do lots of other stuff with navigation bars, etc.]
};
Uno script può ascoltare questo evento e fare qualcosa quando si attiva:
$('.fotorama').on(
'fotorama:show',
function (e, fotorama, extra) {
console.log(e.type + (extra.user ? ' after user’s touch' : ''));
console.log('transition duration: ' + extra.time);
}
);
DOMANDA
Esistono altri modi tradizionali per implementare tale comportamento dei plugin?
In caso contrario, quando si dovrebbero usare gli hook e quando si dovrebbero usare gli eventi? Considerare l'obiettivo finale è rendere il codice più gestibile e leggibile, sia dal punto di vista dell'app che dal punto di vista dello sviluppatore del plug-in?