"Kode bau" apa yang ada merupakan gejala bahwa model pendengar acara diperlukan?

10

Apa saja gejala dalam basis kode yang menunjukkan bahwa pendekatan event-listener diperlukan?

Tampak bagi saya bahwa ketika ada kelas yang perlu dipanggil dengan banyak, tidak didefinisikan pada set waktu desain kelas lain, Anda memerlukan semacam kerangka kerja pensinyalan, tetapi saya ingin mendengar situasi apa yang ada yang akan ditingkatkan dengan mengubah ke model berbasis acara.

lurscher
sumber

Jawaban:

8

Aproach Event / Listener mencoba untuk menghindari kopling ketat , sehingga semua kode berbau yang menunjukkan bahwa, akan mengarah ke appoach.

Berdasarkan itu, saya akan menyarankan gejala-gejala berikut:

  • konstruktor besar , karena setiap objek perlu mengetahui setiap objek lain, dan tidak dapat berfungsi tanpa. Mungkin menyamar sebagai banyak obj.set_dependecy(x)segera setelah panggilan konstruktor.

  • ketergantungan dua arah , karena, tanpa kejadian, dalam bahasa imperatif, aliran informasi pada dasarnya adalah 'push' (memanggil metode seseorang)

  • 'hierarki pengetahuan' sulit ditentukan . Ini adalah dependensi dua arah , hanya fokus lain: jika ada A, yang mendengarkan B, A tahu B, tetapi B tidak dari A, jadi ada 'hierachy': beberapa objek tidak tahu apa-apa, beberapa tahu lainnya , dll. Sebagai contoh, ketika mengimplementasikan MVC seperti ini: http://en.wikipedia.org/wiki/Model_View_Controller , model hanya tahu sendiri, view tahu model, dan controller tahu view dan model.

keppla
sumber
1
Sejauh ini, ketergantungan dua arah adalah tanda yang paling menunjukkan bahwa Anda perlu beralih ke model yang dikendalikan oleh peristiwa. Konstruktor mengasapi mungkin berarti itu, tetapi lebih sering daripada tidak hanya berarti bahwa Anda perlu melakukan lebih banyak dalam hal agregasi, komposisi, dan / atau abstraksi umum (yaitu refactoring, bukan perubahan desain).
Aaronaught
Kamu benar. Saya mencoba memesannya dengan kemudahan deteksi, dan konstruktor besar sangat sederhana, mereka mungkin tertangkap oleh ekspresi reguler.
keppla
6

Ketika Anda tidak bisa atau tidak seharusnya tahu apa yang harus bereaksi terhadap serangkaian pesan / sinyal / peristiwa.

Seringkali ketika Anda ingin "dunia" tahu tentang sesuatu yang terjadi dalam modul (kelas atau sistem kelas) tetapi Anda tidak ingin repot tentang apa yang disebut.

Aroma kode yang terkait, secara spesifik, adalah ketika Anda merasa bahwa Anda mulai mencampur kode dari modul independen, yang satu melakukan sesuatu yang harus bereaksi terhadap yang lain. Setelah Anda melihat bahwa Anda harus memanggil kode dari modul B tergantung pada keadaan / acara modul A, Anda perlu pendengar acara.

Klaim
sumber
3

Saya akan mengubah pertanyaan Anda dan mengatakan: ketika suatu peristiwa berbasis bukan solusi yang tepat untuk aplikasi berorientasi objek? Saya pikir sebagian besar aplikasi OO bisa mendapat manfaat jika dirancang sebagai produsen acara dan konsumen.

Pada akhirnya, "pemanggilan metode" sebenarnya adalah sebuah pesan yang tiba di suatu objek dan objek bertanggung jawab untuk memutuskan apakah itu akan melakukan sesuatu dengan pesan dan melakukan operasi. Ini tidak terlalu jelas dalam bahasa yang sangat diketik seperti Java, tetapi menjadi lebih jelas dalam bahasa dinamis seperti Ruby.

Hal lain yang menarik dari mendesain aplikasi sebagai event based adalah bahwa biasanya komponen internal harus diisolasi dengan baik dan koheren, jika tidak maka kode menjadi berantakan sangat, sangat cepat. Sebagai contoh, saya sangat menyukai konsep Arsitektur Hexagonal yang digunakan oleh Alistair Cockburn, karena biasanya pola ini menciptakan enkapsulasi dan kekuatan yang lebih baik (dalam pandangan saya) komponen yang lebih kohesif.

Saya pikir (tapi saya mungkin salah) bahwa ini juga terkait dengan konsep Perancangan Domain Driven dari Peristiwa Domain , di mana kelas domain memancarkan peristiwa yang ditangkap oleh objek lain, dan objek ini memancarkan peristiwa lain (Anda melihat di mana ini akan: D). Apa yang saya suka tentang pola ini adalah yang mengatakan bahwa antarmuka harus memodelkan Peran, bukan implementasi.

Maaf jika saya tidak masuk akal, saya telah bereksperimen dengan pola-pola ini selama beberapa bulan terakhir dengan hasil yang luar biasa, tetapi saya masih mencoba untuk memahami konsep-konsep dan seberapa jauh mereka mencapai.

Augusto
sumber
2

Pikirkan tentang apa yang harus Anda lakukan jika pendengar acara (alias. Pola Pengamat) tidak ada.

Jika Anda memiliki objek yang memiliki referensi ke daftar objek lain dan memanggil metode pada mereka pada titik tertentu dalam proses, Anda pasti harus memiliki acara di sana.

Jika Anda memiliki bendera pada objek untuk mengatakan bahwa sesuatu telah dilakukan dan Anda menonton bendera itu dari objek lain, Anda pasti harus menggunakan model event-driven.

Namun, jangan bingung ini dengan panggilan balik. Jika Anda memanggil metode pada objek lain dan meneruskannya metode pada objek asal untuk memanggil kembali pada waktu tertentu, Anda harus membiarkannya seperti itu, daripada menggunakan pendengar acara.

pdr
sumber