Rozważ aplikację, która pozwala wtyczkom reagować na przebieg programu.
Znam 2 sposoby na osiągnięcie tego: haczyki i wydarzenia
1. Haki
Użyj wywołań, aby opróżnić funkcje wewnątrz głównego programu. Funkcje te można zastąpić za pomocą wtyczek.
Na przykład Drupal CMS implementuje zaczepy dostępne dla modułów i motywów. Oto przykład implementacji hooka w funkcji 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;
// ...
}
Moduł może implementować modulename_file_copy($file, $source)
funkcję, która zostanie wywołana przez module_invoke_all
in file_copy
. Po zakończeniu tej funkcji file_copy
wznawia wykonywanie.
2. Wydarzenia
Niech aplikacja wysyła zdarzenia, które mogą być odsłuchiwane przez wtyczki. Po otrzymaniu zdarzenia, które subskrybuje, wtyczka przechwytuje przebieg programu i wykonuje niezbędne operacje.
Na przykład wtyczka galerii jQuery Fotorama realizuje kilka zdarzeń . Jako przykład, oto część jego show
metody, która uruchamia fotorama:show
zdarzenie.
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.]
};
Skrypt może nasłuchiwać tego zdarzenia i robić coś po jego uruchomieniu:
$('.fotorama').on(
'fotorama:show',
function (e, fotorama, extra) {
console.log(e.type + (extra.user ? ' after user’s touch' : ''));
console.log('transition duration: ' + extra.time);
}
);
PYTANIE
Czy istnieją inne główne sposoby implementacji takiego zachowania wtyczek?
Jeśli nie, to kiedy należy użyć haczyków, a kiedy zdarzeń? Biorąc pod uwagę ostateczny cel, to uczynienie kodu łatwiejszym w utrzymaniu i czytelnym, zarówno z perspektywy aplikacji, jak i twórcy wtyczek?