Prenons une application qui permet aux plugins de réagir à son flux de programmes.
Je connais 2 façons d'y parvenir: les crochets et les événements
1. Crochets
Utilisez des appels pour vider des fonctions dans le flux de programme principal. Ces fonctions peuvent être remplacées par des plugins.
Par exemple, Drupal CMS implémente des hooks disponibles pour les modules et les thèmes. Voici un exemple de la façon dont le hook est implémenté dans une fonction 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 module peut implémenter une modulename_file_copy($file, $source)
fonction qui sera appelée par le module_invoke_all
in file_copy
. Une fois cette fonction terminée, l' file_copy
exécution reprendra.
2. Événements
Avoir les événements de répartition de l'application, qui peuvent être écoutés par les plugins. Après avoir reçu un événement auquel il a été abonné, un plugin interceptera le flux du programme et effectuera les opérations nécessaires.
Par exemple, un plugin de galerie jQuery Fotorama implémente plusieurs événements . À titre d'exemple, voici une partie de sa show
méthode qui déclenche l' fotorama:show
événement.
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.]
};
Un script peut écouter cet événement et faire quelque chose lorsqu'il se déclenche:
$('.fotorama').on(
'fotorama:show',
function (e, fotorama, extra) {
console.log(e.type + (extra.user ? ' after user’s touch' : ''));
console.log('transition duration: ' + extra.time);
}
);
QUESTION
Existe-t-il d'autres moyens courants pour implémenter un tel comportement de plugin?
Sinon, quand doit-on utiliser des hooks et quand doit-on utiliser des événements? Considérant que le but ultime est de rendre le code plus maintenable et lisible, du point de vue de l'application et du développeur du plugin?