Розглянемо додаток, який дозволяє плагінам реагувати на його програмний потік.
Я знаю 2 способи досягти цього: гачки та події
1. Гачки
Використовуйте дзвінки для порожніх функцій всередині основного потоку програми. Ці функції можуть бути замінені плагінами.
Наприклад, Drupal CMS реалізує гачки, доступні для модулів та тем. Ось приклад того, як гак реалізований у функції 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;
// ...
}
Модуль може реалізувати modulename_file_copy($file, $source)
функцію , яка буде викликатися в module_invoke_all
ін file_copy
. Після закінчення цієї функції file_copy
запуск буде відновлено.
2. Події
Пропонуйте події відправки програми, які можна слухати плагінами. Після отримання події, на яку було підписано, плагін перехопить потік програми та виконає необхідні операції.
Наприклад, плагін галереї jQuery Fotorama реалізує кілька подій . Як приклад, ось частина його show
методу, який розпалює 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.]
};
Сценарій може слухати цю подію і робити щось, коли вона запускається:
$('.fotorama').on(
'fotorama:show',
function (e, fotorama, extra) {
console.log(e.type + (extra.user ? ' after user’s touch' : ''));
console.log('transition duration: ' + extra.time);
}
);
ПИТАННЯ
Чи існують інші основні способи реалізації такої поведінки плагінів?
Якщо ні, то коли слід використовувати гачки, а коли слід використовувати події? Враховуючи кінцеву мету - зробити код більш корисним і читабешим, як з точки зору програми, так і з точки зору розробника плагінів?