Pertimbangkan aplikasi yang memungkinkan plugin bereaksi terhadap aliran programnya.
Saya tahu 2 cara untuk mencapai ini: kait dan acara
1. Kait
Gunakan panggilan untuk mengosongkan fungsi di dalam aliran program utama. Fungsi-fungsi ini dapat ditimpa oleh plugin.
Sebagai contoh, CMS Drupal mengimplementasikan kait yang tersedia untuk modul dan tema. Berikut adalah contoh bagaimana hook diimplementasikan dalam fungsi 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;
// ...
}
Modul dapat mengimplementasikan modulename_file_copy($file, $source)
fungsi yang akan dipanggil oleh module_invoke_all
in file_copy
. Setelah fungsi ini selesai, file_copy
akan melanjutkan eksekusi.
2. Acara
Miliki acara pengiriman aplikasi, yang dapat didengarkan oleh plugin. Setelah menerima acara yang telah dilanggani, sebuah plugin akan mencegat aliran program dan melakukan operasi yang diperlukan.
Misalnya, plugin galeri jQuery Fotorama mengimplementasikan beberapa acara . Sebagai contoh, inilah bagian dari show
metodenya yang memecat fotorama:show
acara tersebut.
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.]
};
Sebuah skrip dapat mendengarkan acara ini dan melakukan sesuatu ketika terjadi:
$('.fotorama').on(
'fotorama:show',
function (e, fotorama, extra) {
console.log(e.type + (extra.user ? ' after user’s touch' : ''));
console.log('transition duration: ' + extra.time);
}
);
PERTANYAAN
Apakah ada cara utama lain untuk menerapkan perilaku plugin semacam itu?
Jika tidak, kapan harus menggunakan kait, dan kapan harus menggunakan acara? Mempertimbangkan tujuan akhir adalah membuat kode lebih mudah dikelola dan dibaca, baik dari perspektif aplikasi maupun pengembang plugin?
Peristiwa yang pasti, memungkinkan abstraksi yang diperlukan sudah pada tingkat arsitektur.
Jangan berharap bahwa siapa pun yang menulis plugin benar-benar melakukannya seperti yang didokumentasikan atau dengan cara apa pun yang benar. Saya telah memelihara API yang terdokumentasi dengan baik dengan jutaan pengguna dan saya dapat memberi tahu Anda dari pengalaman yang sangat menyakitkan bahwa pada dasarnya tidak ada yang pernah membaca dokumentasi dan hampir tidak ada yang menggunakan API dengan benar.
Ambil contoh berikut dengan pengait: Anda memiliki sistem tempat 20 pengaya berjalan. Salah satu plugin memanggil
file_copy
metode dengan cara didokumentasikan dan mengharapkan hasil seperti yang didokumentasikan. Tetapi beberapa plugin lain telah mengaitkan fungsi itu dan oleh karena itu salah satu masalah berikut menyebabkan kerusakan atau kegagalan fungsi:Jika Anda melakukan hal yang sama seperti di atas dengan acara dengan masalah yang sama di dalam plugin itu terjadi hal berikut:
sumber
Warisan dapat menjadi pilihan.
Selain kait, warisan tidak memerlukan definisi metode tambahan, dan tidak ada kehilangan kinerja untuk memanggil metode kosong jika tidak ada yang terhubung.
Selain acara, pewarisan juga tidak perlu kode tambahan untuk permohonan acara.
Namun, pewarisan bekerja paling baik jika hanya ada satu plugin yang memodifikasi satu jenis perilaku. Jika Anda membutuhkan banyak plugin, yang kedua harus berasal dari yang lain dll, yang tidak sesuai.
sumber
Peristiwa pasti. Ini memungkinkan arsitektur Anda menjadi lebih luas.
Bayangkan apa yang akan terjadi jika Anda harus meletakkan plugin Anda ke mesin yang terpisah misalnya. Menggunakan acara - Anda hanya perlu memodifikasi sedikit kedamaian kode untuk membuat acara Anda berbasis jaringan.
sumber