Kapan kait merupakan pilihan desain yang tepat?

10

Saya telah bekerja pada aplikasi Rails besar di mana penggunaan panggilan balik ActiveRecord merajalela dan mengerikan. Menyimpan catatan sering kali memiliki efek samping yang tidak terduga dan itu merupakan tantangan untuk alasan tentang sistem.

Pada saat yang sama, saya telah melihat kait yang digunakan untuk efek yang baik sebagai bagian dari warisan (misalnya kelas induk menggunakan metode templat untuk memungkinkan subkelas menambahkan perilaku khusus tanpa perlu tahu tentang internal orangtua), dan di plug-in (mis. mode emacs menjalankan hook saat diaktifkan, memungkinkan pengguna untuk menambahkan perilaku khusus di sekitar mode itu).

Saya menyadari bahwa aplikasi Rails dan interpreter Lisp adalah sistem yang sangat berbeda, tetapi saya ingin tahu apakah ada kriteria yang dikenal orang ketika memutuskan apakah kait adalah pilihan desain yang tepat untuk masalah yang mereka hadapi.

Tema yang melompat pada saya adalah prediktabilitas. Penyalahgunaan kait tampaknya mengarah pada tindakan seram di kejauhan dan perilaku mengejutkan, sedangkan penggunaan yang baik dapat menyebabkan kerangka kerja yang dapat diprediksi tanpa kopling ketat.

Karena saya masih hanya beberapa tahun dalam karir pemrograman saya, saya menganggap diri saya noob dalam banyak hal, dan mencurigai orang telah memasukkan cukup banyak pemikiran ke dalam topik ini. Apa saja pedoman yang dapat mengarahkan keputusan ini?

ivan
sumber

Jawaban:

5

Hook adalah pilihan desain yang bagus ketika Anda ingin memisahkan detail implementasi dari abstraksi dari konsumennya dengan mentransfer kontrol ke penerima hook.

Anda dapat melakukannya dengan siaran anonim (seperti acara atau panggilan balik anonim), atau dengan menggunakan abstraksi yang diketik (seperti Antarmuka atau kelas induk).

Anda harus menggunakan siaran anonim saat:

  • Panggilan kait adalah opsional
  • Penelepon tidak peduli siapa yang menerima kembali hook.
  • Urutan eksekusi penerima tidak relevan.
  • Anda ingin menyiarkan status objek ke semua pelanggan ke hook.

Anda harus menggunakan abstraksi yang diketik ketika:

  • Memanggil hook adalah wajib.
  • Objek panggilan perlu mengidentifikasi penerima kait.
  • Urutan eksekusi penerima relevan untuk objek Anda.

Contoh kait penyiaran adalah KeyPressedEvent. Kelas yang menembakkan acara tidak peduli siapa yang menerimanya dan menyiarkan status papan ketik kepada siapa pun yang berlangganan acara tersebut. Urutan eksekusi penerima tidak berpengaruh pada status objek dari kelas yang menembakkan peristiwa.

Contoh dari kait abstraksi yang diketik adalah metode templat yang Anda sebutkan. Dalam hal ini, kelas induk memerlukan implementasi untuk metode templatnya, ia tahu bahwa penerima akan menjadi anak-anaknya, dan memiliki urutan eksekusi spesifik untuk metode templat, seperti yang didefinisikan oleh kelas induk.

Cesar Hernandez
sumber
7

Sebagian besar bahasa, dan sebagian besar platform, menggunakan kait, bahkan jika itu berpakaian sebagai sesuatu yang lain. Setiap kali Anda mendengar istilah "acara," "pesan," "pemicu," "sinyal," atau istilah lain seperti itu, Anda mungkin berurusan dengan mengaitkan, meskipun ada pengecualian untuk aturan tersebut, yang mungkin tidak penting untuk diskusi ini.

Anda menggunakannya karena platform menyediakannya untuk Anda, atau bahkan mungkin mengharuskan penggunaannya untuk alasan kinerja. Menggunakan kait sering mengurangi kompleksitas kode, membantu menegakkan persyaratan bisnis, dan mengurangi penggunaan CPU, memperpanjang usia baterai dan perangkat keras. Anda harus menggunakannya kapan pun Anda menginginkan kinerja terbaik dari kode Anda.

Bahkan pengalaman mengerikan Anda dengan Rails cukup banyak mengidentifikasi kasus penggunaan umum untuk kait: aturan bisnis harus ditegakkan, dan kait cukup banyak digunakan secara universal untuk menegakkan aturan bisnis. Sayangnya, tidak semua aturan masuk akal, dan seperti yang Anda tahu, itu membuat segalanya lebih sulit bagi pengembang ketika mereka sewenang-wenang, tapi itu sebabnya dokumentasi sistem sama pentingnya dengan kode itu sendiri.

Sebagai aturan umum, gunakan kait karena mereka adalah fitur kinerja, dan akan membuat kode Anda berjalan lebih efisien daripada alternatif (yang disebut "polling", di mana Anda menunggu dalam lingkaran sibuk untuk memeriksa acara). Namun, pastikan juga Anda menggunakan dokumentasi yang sesuai dan tetap perbarui. Kait digunakan dalam hampir setiap bahasa yang akan Anda temui, dan penting untuk mengetahui mengapa mereka ada.

phyrfox
sumber
1

Saya sebelumnya telah bekerja pada sebuah program yang menurut pendapat saya menggunakan kait dengan baik. Dalam buku saya, hook sebenarnya adalah panggilan (terbitkan) ke daftar panggilan balik (pelanggan). Sangat kuat, penyalahgunaan itu mudah. Pertanyaan terbaik untuk meminta use case adalah: apakah saya ingin mengaktifkan atau menonaktifkan perilaku saat runtime? Misalnya, Anda mungkin ingin mengizinkan pengguna untuk memberikan skrip yang akan Anda jalankan pada acara tertentu, atau membuat program generik yang terbuat dari plugin yang lebih kecil. Maka panggilan kait sesuai. Secara umum, Anda memiliki sedikit pilihan lain.

Jika tidak, Anda harus pergi dengan lengkungan yang baik dari modul Anda. Metode template berfungsi dengan baik dengan fungsi kelebihan beban, Anda tidak perlu logika runtime untuk ini. Anggap itu akan memberlakukan kopling longgar adalah ilusi: ada tingkat ketergantungan yang sama antara sesuatu yang Anda langsung hubungi atau Anda kaitkan, callee harus tetap mengisi kontraknya.

Perhatikan bahwa, mungkin beberapa orang menyebut metode-templat dengan kait fungsi yang kelebihan beban, tetapi itu berbeda dari yang di atas: di sini Anda memiliki tautan statis, dengan risiko lebih rendah masuk ke mimpi buruk pemeliharaan.

Arthur Havlicek
sumber