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?
Certainement événementiel, il permet déjà l'abstraction nécessaire au niveau architectural.
Ne vous attendez pas à ce que quiconque rédige un plug-in le fasse réellement comme documenté ou de quelque manière que ce soit. J'ai maintenu une API bien documentée avec des millions d'utilisateurs et je peux vous dire d'une expérience très pénible que personne ne lit la documentation et presque personne n'utilise l'API correctement.
Prenons l'exemple suivant avec les hooks: Vous avez un système sur lequel 20 plugins sont en cours d'exécution. L'un de ces plugins appelle la
file_copy
méthode dans la manière dont elle est documentée et attend un résultat tel que documenté. Mais un autre plugin a accroché cette fonction et donc l'un des problèmes suivants provoque un crash ou un dysfonctionnement:Si vous faites la même chose que ci-dessus avec des événements avec les mêmes problèmes dans ces plugins, les événements suivants se produisent:
la source
L'héritage peut être une option.
Hormis les hooks, l'héritage n'a pas besoin de définitions de méthode supplémentaires et il n'y a aucune perte de performances pour appeler la méthode vide au cas où il n'y aurait rien de connecté.
Outre les événements, l'héritage n'a également pas besoin de code supplémentaire pour l'invocation d'événements.
Cependant, l'héritage fonctionne mieux s'il n'y a qu'un seul plugin modifiant un type de comportement. Si vous avez besoin de nombreux plugins, le second devra dériver du premier, etc., ce qui n'est pas approprié.
la source
Certainement des événements. Il permet à votre architecture d'être plus évolutive.
Imaginez ce qui se passera si vous devez par exemple placer votre plugin sur une machine distincte. Utilisation d'événements - vous aurez juste besoin de modifier une petite paix de code pour rendre votre réseau d'événements basé.
la source