プラグインがプログラムフローに反応できるようにするアプリを検討してください。
これを達成する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
in によって呼び出される関数を実装できます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);
}
);
質問
そのようなプラグインの動作を実装する他の主流の方法はありますか?
そうでない場合、いつフックを使用する必要があり、いつイベントを使用する必要がありますか?究極の目標を考えることは、アプリとプラグイン開発者の両方の観点から、コードをより保守可能で読みやすいものにすることですか?