Apakah rangkaian acara dianggap praktik yang baik?

15

Dari waktu ke waktu saya telah menemukan skenario di mana beberapa kondisi rumit harus dipenuhi sebelum memicu suatu peristiwa. Selain itu, sebagian besar pendengar juga menjalankan pemeriksaan tambahan untuk menentukan arah tindakan. Ini membuat saya berpikir apakah solusi yang lebih baik adalah berpikir dalam hal kejadian yang lebih kecil dan membiarkannya saling memicu.

Peristiwa chaining akan memungkinkan saya untuk menjalin pendengar tambahan di kemudian hari dengan upaya yang cukup rendah (kemungkinan pelanggaran YAGNI?). Kode saya terdiri dari elemen-elemen sederhana yang mudah dipahami, yang seharusnya tidak sulit dipahami orang lain.

Namun, kemungkinan kerugian dari solusi ini adalah fakta bahwa jika terjadi kesalahan dalam rantai (mis. Pemicu acara palsu karena kesalahan manusia), akan cukup sulit untuk menangkap bug.

Apakah event chaining adalah ide bagus TM ? Jika tidak, apa metode alternatif untuk menjaga kode terkait acara menjadi berantakan?

emas
sumber
1
Saya telah bekerja beberapa tahun terakhir di perpustakaan chaining event untuk JavaScript. kayoub5.github.io/onQuery memungkinkan untuk menulis peristiwa kompleks seperti <br> (A atau B) lalu C lalu (D dan E) sebagai {A + B} > C > {D & E}<br> Ini pasti membantu menulis solusi kompleks dalam waktu yang lebih singkat, tetapi seperti yang disebutkan sebelumnya, pengujian dan debugging masih menyusahkan.
Ayoub Kaanich

Jawaban:

11

Apakah acara chaining adalah ide yang bagus?

Itu salah satu hal yang sepertinya ide yang sangat bagus, sampai Anda menggunakannya.

Sangat sulit untuk mengatur acara kaskade tanpa semacam ketergantungan tersirat pada pesanan. Sulit untuk mengaturnya tanpa menyebabkan masalah karena loop tak terbatas dan kebocoran memori sesekali. Mereka membuat desain kelas lebih sulit karena kopling yang disebabkan oleh peristiwa yang perlu tahu ke mana harus memasang dan ke mana harus mengalir.

Dan mereka sangat sulit dalam debugging dan alasan tentang kode.

Sekarang kadang - kadang mereka dapat digunakan dalam skenario yang relatif terbatas di mana struktur kode membatasi beberapa masalah ini. Di UI, peristiwa cascading dapat digunakan untuk memicu turunnya hierarki karena struktur hierarki itu membantu membatasi kepemilikan dan pengulangan keprihatinan.

Namun, saya menemukan jauh lebih sering hari ini bahwa saya menerima delegasi dalam konstruktor untuk jenis perilaku yang dapat diperluas daripada membiarkan perilaku sewenang-wenang menempel pada saat runtime.

Telastyn
sumber
Beberapa poin bagus, terutama tentang hierarki UI.
vaughandroid
2

Perangkaian acara adalah ide yang bagus jika

  • Ini umumnya sesuai dengan skenario Anda. Contoh sederhana adalah tindakan UI pengguna yang memicu peristiwa visual lainnya.
  • Setiap acara mandiri dan dikelola. Anda tidak ingin solusi menjadi terlalu rumit.
  • Alur kontrolnya mudah diikuti. Itu perlu diimplementasikan pada platform dan dalam bahasa yang mudah bagi pengembang untuk melaluinya. Jika Anda perlu melacak metode "ajaib" untuk melacak apa yang terjadi, Anda salah jalan.

Sangat penting untuk memikirkan solusinya dan menggeneralisasikan beberapa hal sebelum mulai membangun sistem. Misalnya, dalam bahasa OO Anda harus memiliki antarmuka dasar atau kelas abstrak sebagai dasar untuk semua acara. Kelas itu harus memasukkan hal-hal seperti logging / debugging. Anda mungkin juga ingin kelas manajemen acara umum untuk menangani kegagalan dengan anggun.

Matt S
sumber
2

Berbicara dari sudut pandang seseorang yang pernah menghabiskan beberapa hari melacak kesalahan terkait peristiwa, ini adalah ide yang sangat buruk. Anda menyembunyikan aliran kontrol Anda yang (seperti yang Anda catat) dapat menjadikan debugging sebagai mimpi buruk. Situasi saya muncul ketika seseorang menambahkan beberapa kode penanganan kesalahan yang mereset kontrol. Hal ini menyebabkan rantai onPropertyChangepenangan yang akhirnya menyegarkan kontrol yang memiliki penangan kesalahan, yang menyebabkannya mengatur ulang kontrol yang lain lagi, dan seterusnya. Pada dasarnya UI hanya akan mengunci dengan CPU dipatok pada 100%.

Jika Anda memiliki beberapa cara untuk mencegah event handler dipicu lebih dari satu kali untuk root event yang sama, maka Anda mungkin dapat menghindari hal ini, tetapi saya bisa membayangkan situasi di mana Anda mungkin ingin lebih banyak doa event handler.

TMN
sumber
1
Ini terdengar seperti masalah dengan implementasi spesifik, bukan dengan konsep pada umumnya.
Matt S
Saya pikir masalah dengan aliran kontrol non-deterministik melekat pada desain. Kecuali jika Anda mengkode aliran yang sangat spesifik dan tidak menggunakan mekanisme pub / sub-tujuan umum.
TMN
2

Melaksanakan chaining event dengan baik sulit, untuk semua alasan yang disebutkan oleh orang lain.

Namun, ini juga merupakan premis dasar dari kebanyakan mesin aturan. JBoss Drools, IBM jRules, PegaSystems, Corticon, dan FICO Blaze Advisor adalah semua Sistem Manajemen Aturan Bisnis (BRMS) utama yang memungkinkan pengguna untuk mendeklarasikan aturan yang dijalankan berdasarkan peristiwa yang terjadi dalam sistem. Baik rantai maju maupun mundur dimungkinkan dan bisa dilakukan.

Bahasa Prolog dan turunannya didasarkan pada gagasan yang sama.

Algoritma yang terlibat tidak sederhana, men-debug BISA terasa menyebalkan, tetapi ada banyak nilai yang dapat ditemukan dalam model.

Matthew Flynn
sumber
1

Salah satu kelemahan potensial adalah cukup mudah untuk tidak sengaja berakhir dengan perulangan pembaruan. misalnya A -> B -> C -> A -> B ...

Pendekatan lain adalah membuat event gabungan yang bertanggung jawab untuk menembakkan urutan kejadian. Ini berarti Anda tidak seharusnya terjebak dalam satu lingkaran, dan memberi Anda satu tempat untuk menangkap kesalahan / dll. Saya sudah cukup sukses dengan ini, meskipun diakui belum menggunakannya untuk hal yang sangat rumit (belum!).

vaughandroid
sumber