web-dev-qa-db-fra.com

Que devraient-ils utiliser les plugins: hameçons, événements ou autre chose?

Considérez une application qui permet aux plugins de réagir à son flux de programme.

Je sais 2 façons d'atteindre cet objectif: hameçons et Événements

1. Crochets

Utilisez des appels vers des fonctions vides dans le flux de programme principal. Ces fonctions peuvent être remplacées par les plugins.

Par exemple, Drupal CMS implémente des crochets disponibles pour les modules et les thèmes. Voici un exemple de la manière dont l'accrochage est implémenté dans une fonction fichier_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 fonction modulename_file_copy($file, $source) qui sera appelée par le module_invoke_all Dans file_copy. Une fois cette fonction finition, le file_copy Reprendra l'exécution.

2. Événements

Demandez aux applications de l'application, qui peuvent être écoutées par les plugins. Après avoir reçu un événement qu'il a été abonné, un plugin interceptera le flux de programme et effectuera des opérations requises.

Par exemple, un plug-in Jackery Gallery Fotorama implément plusieurs événements . Par exemple, voici une partie de sa méthode show qui tire l'événement 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.]
  };

Un script peut écouter cet événement et faire quelque chose quand il tire:

$('.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 [~ # ~] [~ # ~ ~]

  1. Y a-t-il d'autres moyens multiples de mettre en œuvre un tel comportement du plugin?

  2. Sinon, quand faut-il utiliser des crochets et quand faut-il utiliser des événements? Considérant que l'objectif ultime est de rendre le code plus maintenu et lisible, de l'application et du point de vue du développeur du plugin?

24
sbichenko

L'héritage peut être une option.

Autre des crochets, l'héritage n'a pas besoin de définitions de méthode supplémentaires, et il n'y a pas de perte de performance pour appeler la méthode vide au cas où il n'y a rien à croquer.

Autre des événements, l'héritage n'a pas non plus besoin de code supplémentaire pour l'invocation des é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 plug-ins, la seconde nécessiterait de dériver du premier etc., ce qui n'est pas approprié.

1
Thomas Weller

Certainement des événements. Cela permet à votre architecture être plus large.

Imaginez ce qui se passera si vous aurez besoin de placer votre plugin sur une machine distincte par exemple. En utilisant des événements - vous devez simplement modifier une petite paix de code pour effectuer votre réseau d'événements basé sur votre réseau.

0
vpol