Considera un'app che permetta ai plug-in di reagire al suo flusso di programma.
Conosco 2 modi per ottenere ciò: hook e eventi
1. Ganci
Usa le chiamate per svuotare le funzioni all'interno del flusso del programma principale. Queste funzioni possono essere sostituite dai plug-in.
Ad esempio, Drupal CMS implementa hook che sono disponibili per moduli e temi. Ecco un esempio di come viene implementato l'hook 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 funzione modulename_file_copy($file, $source)
che verrà chiamata da module_invoke_all
in file_copy
. Al termine di questa funzione, file_copy
riprenderà l'esecuzione.
2. Eventi
Avere l'app invia eventi, che possono essere ascoltati dai plugin. Dopo aver ricevuto un evento a cui è stato sottoscritto, un plug-in intercetterà il flusso del programma ed eseguirà operazioni necessarie.
Ad esempio, un plugin per galleria jQuery Fotorama implementa diversi eventi . Ad esempio, ecco una parte del suo metodo show
che genera l'evento fotorama:show
.
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 plug-in?
-
In caso negativo, quando si dovrebbero usare gli hook e quando si dovrebbero usare gli eventi? Considerare l'obiettivo finale è rendere il codice più controllabile e leggibile, sia dall'app che dal punto di vista dello sviluppatore del plugin?