Apa perbedaan antara pola publikasi dan berlangganan?

11

Pemahaman saya adalah bahwa pernyataan Goto umumnya disukai . Tetapi pola mempublikasikan-berlangganan tampaknya secara konseptual serupa di mana ketika sepotong kode menerbitkan pesan, ia melakukan transfer kontrol satu arah. Programmer mungkin tidak tahu bagian mana dari program yang berlangganan pesan ini.

Saya telah melihat sesuatu yang serupa di banyak program JavaScript di mana acara digunakan untuk "melompat" di seluruh modul. Apakah saya kehilangan sesuatu tentang pola publikasi-berlangganan atau event-driven?

gwg
sumber
5
return, try/catch, break, continue, switch- mereka adalah semua goto dengan berbagai tingkat pembatasan dibangun di Goto dianggap berbahaya berbahaya bagi pemikiran tentang cara kerja kode..
@MichaelT: Untuk sebagian besar kasus, ada alternatif untuk goto yang membuatnya lebih mudah untuk alasan tentang kode. Tidak ada salahnya menghargai fakta itu. Kerusakan hanya terjadi jika Anda tidak menggunakan goto saat dibenarkan (yang biasanya tidak), atau jika Anda menggunakan goto dengan sembarangan. Saya percaya Apple menunjukkan kepada kita contoh yang baik dari yang terakhir.
back2dos
... tidak tahu apa bagian dari program berlangganan ... : Perbedaan utama pertama dengan gotokebohongan di s pada akhir bagian . Perbedaan besar kedua tidak ada pada ide . Perbedaan utama ketiga adalah bahwa secara konseptual a gosub, bukan a goto.
mouviciel
1
Lebih dekat dengan INTERCAL "berasal dari".
CodesInChaos
@ back2do itu juga contoh yang bagus mengapa saya lebih suka pengguna kurung kurawal bahkan untuk blok kode 1-line.
MetaFight

Jawaban:

19

Yap, Anda pasti melewatkan sesuatu . Gotos biasanya akan digunakan, seperti yang Anda katakan, untuk melakukan transfer kontrol satu arah.

Namun, acara tidak melakukan itu. Ketika kode menjalankan acara, ia mengetahui sepenuhnya bahwa sekali peristiwa diterbitkan (atau diproses, antri, dipecat ... dll) eksekusi kode akan dilanjutkan pada baris berikutnya dalam kode yang menghasilkan acara.

Penggunaan goto menciptakan hubungan yang sangat erat antara kode yang menyebut pernyataan itu dan kode yang ada di pihak penerima. Pengembang harus memiliki pengetahuan yang intim tentang kedua tempat untuk menggunakan goto.

Di sisi lain, kode yang memadamkan acara biasanya tidak tahu atau peduli siapa yang tertarik mendengarkan acara itu. Ada bisa menjadi pendengar. Atau mungkin ada 100 pendengar atau 0. Pendengar itu bisa berada di program yang sama di mana acara dipecat, atau mereka bisa berada dalam aplikasi yang sama sekali berbeda, atau mereka bisa berada di mesin yang berbeda. Sejauh menyangkut penerbit, segera setelah ia menghasilkan acara pekerjaannya selesai.

Jika Anda bersama saya sejauh ini, apa yang saya jelaskan di atas adalah kasus ideal pola pub / sub. Sayangnya di dunia nyata hal-hal yang tidak selalu ideal dan ada kasus di mana penerbit menghasilkan suatu acara, pelanggan dipanggil, mengubah sejumlah negara dan pada saat eksekusi kode waktu kembali ke penerbit "dunia" tampaknya memiliki telah terbalik. Dan saya yakin Anda pernah mengalami ini di masa lalu, karena kondisi ini sering muncul ketika pub / sub pola diimplementasikan dengan cara yang sangat sederhana (misalnya melalui penggunaan delegasi atau acara di C #, atau fungsi / pointer antarmuka di C / C ++).

Tetapi masalah ini tidak harus pub / sub pola melainkan implementasi itu. Inilah sebabnya mengapa banyak sistem bergantung pada antrian sehingga ketika sebuah acara diterbitkan, itu hanya akan di-antri untuk dipanggil kemudian memberi penerbit kesempatan untuk menyelesaikan eksekusi ketika dunia masih utuh. Ketika penerbit selesai melakukan pekerjaannya, loop acara (alias loop pengiriman) akan menghapus acara dan meminta pelanggan.

DXM
sumber
+1 mempublikasikan / berlangganan memungkinkan kopling longgar; goto tidak
Fuhrmanator
6

Ada beberapa perbedaan. Pertama, ketika sebuah kode mengeksekusi GOTO, ia melepaskan kendali, dan tidak ada jaminan bahwa ia akan mendapatkan kembali kendali. Namun, penerbit di pub / sub akan terus menjalankan dan menjalankan logikanya, mengirimkan pesan yang sesuai. Perilakunya bisa dimengerti dan diprediksi.

Kedua, pelanggan akan menerima pesan, dan tidak seperti dengan GOTO, pesan itu sendiri membawa konteks. Baik jenis pesan, dan properti apa pun yang dibawanya, membantu memberi tahu pelanggan untuk melakukan perannya. Dan, setelah menangani pesan, pelanggan masih dapat mengambil pesan baru. Jadi perilakunya juga bisa dimengerti dan diprediksi.

Perbedaan besar adalah bahwa penerbit dan pelanggan memiliki alur eksekusi yang terdefinisi dengan baik, dan mereka pada dasarnya akan terus berulang dan melakukan pekerjaan mereka, saat mengirim dan menerima pesan. Kode dengan GOTOs dapat ditulis dengan baik dan teratur, tetapi juga dapat mendegradasi, dan tidak ada jaminan sama perilaku dipahami dengan jelas.

Kamu benar. Seseorang dapat menulis sistem pub / sub dengan begitu banyak pesan dan begitu banyak lompatan kecil yang melacak alur pemrosesan dapat menjadi mimpi buruk. Dan di sisi lain, Anda dapat menulis sistem dengan GOTO yang berperilaku sangat tertib dan mudah dipahami. (Saya sedang memikirkan kode perakitan untuk sistem yang sangat kompleks sebelum bahasa simbolik mengambil alih.)

Tetapi biasanya, decoupling yang Anda dapatkan dari pub / sub menyederhanakan masalah pemrosesan terdistribusi dan decouples logika dalam sistem Anda. Juga biasanya, GOTO langsung cenderung membuat sistem yang rumit di mana pemahaman aliran kontrol menjadi bermasalah.

rampok
sumber