Saya pikir saya secara konseptual memahami delegasi C #, namun, saya berjuang untuk menemukan contoh dunia nyata di mana mereka akan berguna. Bisakah Anda memberikan beberapa jawaban yang merinci bagaimana delegasi C # digunakan dalam aplikasi nyata dan masalah apa yang memungkinkan Anda untuk melakukannya.
16
Jawaban:
Kode GUI menggunakan delegasi untuk menangani acara, seperti klik tombol, pergerakan jendela. Menggunakan delegasi memungkinkan Anda memiliki fungsi yang dipanggil kapan pun peristiwa itu terjadi. Contohnya adalah menautkan fungsi yang menyimpan data ke tombol "Simpan" pada antarmuka. Ketika tombol diklik itu diatur untuk menjalankan fungsi yang menyimpan data. Ini berguna dalam pemrograman GUI karena seluruh program Anda bisa menunggu pengguna untuk melakukan sesuatu dan Anda tidak memiliki cara untuk mengetahui apa yang akan mereka lakukan terlebih dahulu. Menggunakan delegasi memungkinkan fungsionalitas program Anda untuk terhubung ke UI sedemikian rupa sehingga pengguna dapat melakukan hal-hal dengan cara apa pun yang mereka inginkan.
sumber
Linq menggunakan
Func<T>
danAction<T>
mendelegasikan seluruh tempat sebagai parameter.Ini memungkinkan Anda untuk menggunakan ekspresi lambda sebagai parameter dan menentukan tindakan yang akan diambil sebagai bagian dari daftar parameter.
sumber
Sebenarnya apa pun yang menggunakan Pola Pengamat kemungkinan akan menerapkan delegasi.
Baca deskripsi dan Anda mungkin akan membayangkan beberapa skenario di mana Anda akan menggunakannya. Penanganan acara GUI adalah contoh umum.
sumber
Delegasi sangat berguna dalam pemrograman asinkron.
Anda memiliki kelas yang melakukan hal-hal secara tidak sinkron dan memiliki panggilan balik. Anda dapat meminta metode delegasi dipanggil saat panggilan balik - dan implementasi kelas Anda akan melakukan logika yang dijelaskan dalam metode delegasi Anda.
sumber
Delegasi sangat berguna sebagai solusi untuk lubang di pola tengah . Pada dasarnya, ada banyak kasus di mana Anda ingin membungkus satu set instruksi unik di dalam sekelompok instruksi umum. Ini sangat sulit jika instruksi sebelum dan sesudah bit unik perlu berbagi status. Dengan delegasi, Anda bisa meneruskan delegasi ke suatu fungsi. Fungsi mengeksekusi bit sebelum, mengeksekusi delegasi, lalu mengeksekusi bit setelah.
sumber
Di "masa lalu" bahasa non-OOP seperti Fortran dan C, sangat berguna untuk memiliki subrutin yang menerima argumen yang merupakan penunjuk ke fungsi. Misalnya,
qsort
fungsi ini berfungsi dengan fungsi perbandingan yang disediakan pengguna. Ada banyak subrutin untuk menyelesaikan persamaan diferensial biasa, atau untuk mengoptimalkan fungsi, dan mereka semua menggunakan pointer fungsi sebagai argumen.Dalam sistem windowing, semua jenis panggilan balik mengikuti pola yang sama.
Di Lisp, bahkan pada hari-hari awal, ada sesuatu yang disebut "argumen fungsional" atau FUNARG, yang tidak hanya fungsi, tetapi juga mengandung konteks penyimpanan di mana ia dapat mengingat dan berinteraksi dengan bagian dari dunia luar.
Kebutuhan yang sama ada dalam bahasa OOP, kecuali ketika Anda melewati alamat fungsi Anda juga harus melewati alamat objek fungsi adalah metode. Itu dua hal yang harus Anda lewati. Jadi delegasi hanya itu, dan memungkinkan pola lama yang baik untuk tetap digunakan.
sumber
Berikut adalah contoh sederhana yang menunjukkan bagaimana delegasi yang berguna dapat membuat kode sederhana yang mengikuti prinsip KERING. Ini juga memungkinkan Anda untuk menjaga kode sangat dekat dengan tempat yang dibutuhkan.
Ini adalah contoh nyata dari keuntungan yang diberikan oleh delegasi.
sumber
Pertemuan pertama saya dengan delegasi sedang memeriksa pembaruan program (windows form C # 3.5) dengan mengunduh file dari situs web saya, tetapi untuk menghindari pembaruan memeriksa mengunci seluruh program saya menggunakan delegasi dan utas untuk melakukannya secara tidak sinkron.
sumber
Saya telah melihat implementasi yang menarik dari pola Strategi yang menggunakan delegasi secara efektif. (yaitu strateginya adalah delegasi)
Yang saya lihat adalah pathfinding di mana algoritma untuk menemukan path adalah delegasi yang dapat (kembali) ditugaskan pada saat runtime sehingga algoritma yang berbeda dapat digunakan (BFS vs A * dll.)
sumber
Banyak pola GoF klasik dapat diimplementasikan dengan delegasi: Misalnya, pola Komando, pola Pengunjung, pola Strategi, pola Pabrik dan pola Pengamat sering dapat diimplementasikan dengan delegasi sederhana. Kadang-kadang, kelas lebih baik (misalnya ketika perintah membutuhkan nama atau objek strategi perlu diserialisasi) tetapi dalam kebanyakan kasus, menggunakan
Action<...>
atauFunc<...>
jauh lebih elegan daripada membuat antarmuka satu metode khusus.sumber