Delegasi vs. peristiwa

Sebelumnya

Pengembang yang baru menggunakan platform .NET sering kesulitan saat memutuskan antara desain berdasarkan delegates dan desain berdasarkan events. Pilihan delegasi atau peristiwa seringkali sulit, karena dua fitur bahasa tersebut serupa. Peristiwa bahkan dibangun menggunakan dukungan bahasa untuk delegasi. Deklarasi penanganan aktivitas mendeklarasikan jenis delegasi.

Keduanya menawarkan skenario pengikatan terlambat: mereka mengaktifkan skenario di mana komponen berkomunikasi dengan memanggil metode yang hanya diketahui pada waktu proses. Keduanya mendukung metode pelanggan tunggal dan ganda. Anda mungkin menemukan istilah-istilah ini disebut sebagai dukungan penyiaran tunggal dan penyiaran grup. Keduanya mendukung sintaksis serupa untuk menambahkan dan menghapus handler. Terakhir, menaikkan peristiwa dan memanggil delegasi menggunakan sintaks panggilan metode yang sama persis. Keduanya bahkan mendukung sintaks metode Invoke() yang sama untuk digunakan dengan operator ?..

Dengan semua kesamaan tersebut, mudah untuk mengalami kesulitan menentukan kapan harus menggunakan yang mana.

Mendengarkan event bersifat opsional

Pertimbangan terpenting dalam menentukan fitur bahasa mana yang akan digunakan adalah apakah harus ada pelanggan yang terlampir atau tidak. Jika kode Anda harus memanggil kode yang disediakan oleh pelanggan, Anda harus menggunakan desain berdasarkan delegasi saat Anda perlu menerapkan panggilan balik. Jika kode Anda dapat menyelesaikan semua pekerjaannya tanpa memanggil pelanggan apa pun, Anda harus menggunakan desain berdasarkan peristiwa.

Pertimbangkan contoh yang dibuat selama bagian ini. Kode yang Anda buat menggunakan List.Sort() harus diberi fungsi pembanding untuk mengurutkan elemen dengan benar. Kueri LINQ harus dilengkapi dengan delegate untuk menentukan elemen yang harus dikembalikan. Keduanya menggunakan desain yang dibangun dengan delegasi.

Pertimbangkan peristiwa Progress. Ini melaporkan kemajuan dalam suatu tugas. Tugas tetap berlanjut apakah ada pendengar atau tidak. FileSearcher adalah contoh lain. Ini tetap akan mencari dan menemukan semua file yang dicari, bahkan tanpa pengamat acara yang terkait. Kontrol UX masih berfungsi dengan benar, bahkan ketika tidak ada pelanggan yang mendengarkan peristiwa. Keduanya menggunakan desain berdasarkan peristiwa.

Nilai pengembalian memerlukan delegasi

Pertimbangan lain adalah prototipe metode yang Anda inginkan untuk metode delegasi Anda. Seperti yang Anda lihat, delegasi yang digunakan untuk peristiwa semuanya memiliki jenis pengembalian yang batal. Ada idiom untuk membuat penanganan aktivitas yang meneruskan informasi kembali ke sumber peristiwa melalui memodifikasi properti objek argumen peristiwa. Meskipun cara-cara ini berfungsi, mereka tidak sealamiah mengembalikan nilai dari suatu metode.

Perhatikan bahwa kedua heuristik ini seringkali dapat hadir: Jika metode delegasi Anda mengembalikan nilai, itu mempengaruhi algoritma dalam beberapa cara.

Acara memiliki pemanggilan privat

Kelas selain kelas tempat peristiwa dimuat hanya dapat menambahkan dan menghapus pendengar peristiwa; hanya kelas yang berisi peristiwa yang dapat memanggil peristiwa. Peristiwa biasanya adalah anggota dari kelas publik. Sebagai perbandingan, delegasi sering diteruskan sebagai parameter dan disimpan sebagai anggota kelas privat, jika mereka disimpan sama sekali.

Pendengar peristiwa sering memiliki masa pakai yang lebih lama

Masa pakai pendengar acara yang lebih lama adalah pembenaran yang sedikit lebih lemah. Namun, Anda mungkin menemukan bahwa desain berbasis peristiwa lebih alami ketika sumber peristiwa meningkatkan peristiwa dalam jangka waktu yang lama. Anda dapat melihat contoh desain berbasis peristiwa untuk kontrol UX pada banyak sistem. Setelah Anda berlangganan peristiwa, sumber peristiwa dapat memicu peristiwa sepanjang masa pakai program. (Anda dapat berhenti berlangganan dari peristiwa ketika Anda tidak lagi membutuhkannya.)

Berbeda dengan banyak desain berbasis delegat, di mana delegat digunakan sebagai argumen untuk metode, dan delegat tidak digunakan setelah metode tersebut selesai dipanggil.

Evaluasi dengan hati-hati

Pertimbangan di atas bukan aturan yang kaku dan tegas. Sebaliknya, mereka mewakili panduan yang dapat membantu Anda memutuskan pilihan mana yang terbaik untuk penggunaan khusus Anda. Karena mirip, Anda bahkan dapat membuat prototipe keduanya, dan mempertimbangkan mana yang terasa lebih alami untuk digunakan. Keduanya menangani skenario pengikatan terlambat dengan baik. Gunakan salah satu yang mengomunikasikan desain Anda dengan terbaik.