Hãy xem xét một ứng dụng cho phép các plugin phản ứng với luồng chương trình của nó.
Tôi biết 2 cách để đạt được điều này: móc và sự kiện
1. Móc
Sử dụng các cuộc gọi đến các chức năng trống bên trong luồng chương trình chính. Các chức năng này có thể được ghi đè bằng các plugin.
Ví dụ, Drupal CMS thực hiện các hook có sẵn cho các mô-đun và chủ đề. Đây là một ví dụ về cách hook được thực hiện trong hàm 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;
// ...
}
Một mô-đun có thể thực hiện một modulename_file_copy($file, $source)
chức năng sẽ được gọi bởi module_invoke_all
in file_copy
. Sau khi chức năng này kết thúc, file_copy
sẽ tiếp tục thực hiện.
2. Sự kiện
Có các sự kiện gửi ứng dụng, có thể được nghe bởi các plugin. Sau khi nhận được một sự kiện mà nó đã được đăng ký, một plugin sẽ chặn luồng chương trình và thực hiện các hoạt động cần thiết.
Ví dụ, một plugin thư viện jQuery Fotorama thực hiện một số sự kiện . Ví dụ, đây là một phần của show
phương thức fotorama:show
tổ chức sự kiện này.
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.]
};
Một kịch bản có thể nghe sự kiện này và làm một cái gì đó khi nó phát sinh:
$('.fotorama').on(
'fotorama:show',
function (e, fotorama, extra) {
console.log(e.type + (extra.user ? ' after user’s touch' : ''));
console.log('transition duration: ' + extra.time);
}
);
CÂU HỎI
Có những cách chủ đạo khác để thực hiện hành vi plugin như vậy?
Nếu không, khi nào nên sử dụng móc, và khi nào nên sử dụng các sự kiện? Xem xét mục tiêu cuối cùng là làm cho mã dễ bảo trì và dễ đọc hơn, từ cả quan điểm của ứng dụng và nhà phát triển plugin?