Considere um aplicativo que permita que os plug-ins reajam ao fluxo do programa.
Conheço duas maneiras de conseguir isso: ganchos e eventos
1. Ganchos
Use chamadas para funções vazias dentro do fluxo principal do programa. Essas funções podem ser substituídas por plugins.
Por exemplo, o Drupal CMS implementa ganchos disponíveis para módulos e temas. Aqui está um exemplo de como o hook é implementado em uma função 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;
// ...
}
Um módulo pode implementar uma modulename_file_copy($file, $source)
função que será chamada pelo module_invoke_all
in file_copy
. Após o término desta função, a file_copy
execução será retomada.
2. Eventos
Tenha os eventos de despacho do aplicativo, que podem ser ouvidos pelos plug-ins. Depois de receber um evento no qual foi inscrito, um plug-in interceptará o fluxo do programa e executará operações necessárias.
Por exemplo, um plug-in da galeria jQuery Fotorama implementa vários eventos . Como exemplo, aqui está uma parte de seu show
método que dispara o fotorama:show
evento.
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.]
};
Um script pode ouvir esse evento e fazer alguma coisa quando é acionado:
$('.fotorama').on(
'fotorama:show',
function (e, fotorama, extra) {
console.log(e.type + (extra.user ? ' after user’s touch' : ''));
console.log('transition duration: ' + extra.time);
}
);
QUESTÃO
Existem outras maneiras comuns de implementar esse comportamento de plug-in?
Caso contrário, quando se deve usar ganchos e quando se deve usar eventos? Considerando que o objetivo final é tornar o código mais fácil de ler e legível, tanto da perspectiva do desenvolvedor do aplicativo quanto do plugin?