Perbedaan antara Pengamat, Pub / Sub, dan Binding Data


163

Apa perbedaan antara Pola Pengamat , Terbit / Berlangganan , dan Pengikatan Data ?

Saya mencari-cari sedikit di Stack Overflow dan tidak menemukan jawaban yang baik.

Apa yang saya yakini adalah bahwa pengikatan data adalah istilah umum dan ada berbagai cara untuk mengimplementasikannya seperti Pola Pengamat atau pola Pub / Sub. Dengan pola Pengamat, Observable memperbarui Pengamatnya. Dengan Pub / Sub, 0-banyak penerbit dapat mempublikasikan pesan dari kelas tertentu dan 0-banyak pelanggan dapat berlangganan pesan dari kelas tertentu.

Apakah ada pola penerapan "pengikatan data" lainnya?


Saya menemukan satu lagi: pengecekan kotor yang dilakukan Angular.js. Info lebih lanjut di sini: stackoverflow.com/questions/9682092/databinding-in-angularjs
Jess

Jawaban:


143

Inilah pendapat saya tentang ketiganya:

Binding Data

Pada dasarnya, pada intinya ini hanya berarti "nilai properti X pada objek Y secara semantik terikat dengan nilai properti A pada objek B. Tidak ada asumsi yang dibuat tentang bagaimana Y mengetahui atau diberi makan perubahan pada objek B.

Observer, atau Observable / Observer

Suatu pola desain dimana suatu benda diimbuhi dengan kemampuan untuk memberi tahu orang lain tentang peristiwa tertentu - biasanya dilakukan dengan menggunakan peristiwa aktual, yang merupakan semacam slot seperti pada objek dengan bentuk fungsi / metode tertentu. Yang diamati adalah orang yang memberikan notifikasi, dan pengamat menerima notifikasi tersebut. Di .net, yang dapat diamati dapat mengekspos suatu peristiwa dan pengamat berlangganan acara tersebut dengan kait berbentuk "pengendali acara". Tidak ada asumsi yang dibuat tentang mekanisme spesifik yang terjadi notifikasi, atau tentang jumlah pengamat yang dapat diberitahukan.

Pub / Sub

Nama lain (mungkin dengan semantik "siaran") dari pola Observable / Observer, yang biasanya menyiratkan citarasa yang lebih "dinamis" - pengamat dapat berlangganan atau berhenti berlangganan notifikasi dan satu yang dapat diamati dapat "berteriak" ke banyak pengamat. Di .NET, orang dapat menggunakan acara standar untuk ini, karena acara adalah bentuk MulticastDelegate, dan juga dapat mendukung pengiriman acara ke beberapa pelanggan, dan juga mendukung berhenti berlangganan. Pub / Sub memiliki makna yang sedikit berbeda dalam konteks tertentu, biasanya melibatkan lebih banyak "anonimitas" antara peristiwa dan eventer, yang dapat difasilitasi oleh sejumlah abstraksi, biasanya melibatkan beberapa "perantara" (seperti antrian pesan) yang mengetahui semua pihak, tetapi masing-masing pihak tidak tahu tentang satu sama lain.

Binding Data, Redux

Dalam banyak pola "seperti MVC", yang dapat diamati memperlihatkan beberapa cara "pemberitahuan perubahan properti" yang juga berisi informasi tentang properti spesifik yang diubah. Pengamat tersirat, biasanya dibuat oleh kerangka kerja, dan berlangganan notifikasi ini melalui beberapa sintaks yang mengikat untuk secara khusus mengidentifikasi objek dan properti, dan "event handler" hanya menyalin nilai baru, berpotensi memicu pembaruan atau logika penyegaran.

Pengikatan data Redux

Implementasi alternatif untuk pengikatan data? Ok, ini yang bodoh:

  • thread latar belakang dimulai yang secara konstan memeriksa properti terikat pada suatu objek.
  • jika utas itu mendeteksi bahwa nilai properti telah berubah sejak pemeriksaan terakhir, salin nilainya ke item terikat.

Saya menghargai jawaban Anda dan berusaha menerapkan ide pengikatan data yang berbeda.
Jess

@ jessemon heh, tidak ada masalah; pola pengamat jelas merupakan pendekatan "abstrak terbaik" yang saya sadari, tetapi contoh kecil saya yang mengerikan juga akan "melakukan pengikatan data", meskipun dalam cara yang kacau dan tidak efisien.
JerKimball

7
Jujur, saya bosan mendengar "pub / sub alias pola pengamat", mereka sama sekali tidak sama. Pub / sub adalah sistem acara, pola pengamat menggunakan sistem acara untuk menerbitkan acara secara OTOMATIS pada perubahan objek. Jika Anda memancarkan acara secara manual setiap kali Anda mengubah suatu objek, Anda tidak menggunakan pola pengamat.
BT

154

Ada dua perbedaan utama antara pola Observer / Observable dan Publisher / Pelanggan:

  1. Pola Observer / Observable sebagian besar diimplementasikan secara sinkron , yaitu observable memanggil metode yang tepat dari semua pengamatnya ketika beberapa peristiwa terjadi. Pola Penerbit / Pelanggan sebagian besar diimplementasikan dalam cara yang tidak sinkron (menggunakan antrian pesan).

  2. Dalam pola Pengamat / Yang Dapat Diobservasi , para pengamat menyadari hal yang dapat diamati . Padahal, di Publisher / Pelanggan , penerbit dan pelanggan tidak perlu saling mengenal . Mereka hanya berkomunikasi dengan bantuan antrian pesan.

Seperti yang Anda sebutkan dengan benar, pengikatan data adalah istilah umum dan dapat diimplementasikan menggunakan metode Observer / Observable atau Publisher / Subscriber. Data adalah Penerbit / Pelanggan.


7
Saya sedang membaca Aplikasi Web JavaScript oleh O'Reilly ( shop.oreilly.com/product/0636920018421.do ). Dalam Bab 2 Alex mengimplementasikan pub/subacara JS menggunakan. Ini adalah jenis implementasi callback, tetapi ini adalah contoh yang sinkron .
Jess

5
Saya belum membaca buku itu tetapi jika itu diimplementasikan menggunakan JS "peristiwa", itu akan menjadi tidak sinkron karena peristiwa asinkron dengan definisi.
Param

3
Hai Jess, tentu saja Anda benar. Tidak ada definisi standar untuk istilah ini 😊
Param

14
Secara umum observable memiliki daftar pengamat (itu tertera di atas daftar ini untuk mengirim acara ke mereka semua). Penerbit umumnya hanya mengetahui antrian di mana ia mempublikasikan acara / pesannya. Tidak tahu berapa banyak pelanggan yang berlangganan antrian itu.
Param

7
Bagi saya, ini adalah perbedaan penting antara keduanya: Juga, dalam pola pengamat, pengamat sadar akan yang bisa diamati. Padahal, di Pub / Sub, baik penerbit, maupun konsumen tidak perlu saling mengenal. Mereka hanya berkomunikasi dengan bantuan antrian pesan. Jawaban bagus!
maryisdead

23

Saya sedikit geli bahwa semua jawaban di sini mencoba menjelaskan perbedaan halus antara pola Observer dan Pub / Sub tanpa memberikan contoh konkret. Saya yakin sebagian besar pembaca masih tidak tahu bagaimana menerapkan masing-masing dengan membaca satu sinkron dan yang lainnya asinkron.

Satu hal yang perlu diperhatikan adalah: Tujuan dari pola-pola ini adalah mencoba memisahkan kode

Pengamat adalah pola desain di mana objek (dikenal sebagai subjek) memelihara daftar objek tergantung padanya (pengamat), secara otomatis memberi tahu mereka tentang setiap perubahan untuk menyatakan.

Pola pengamat

Ini berarti observable objectmemiliki daftar di mana ia menyimpan semua observers(yang biasanya fungsinya). dan dapat melintasi daftar ini dan menjalankan fungsi-fungsi ini saat rasanya menyenangkan.

lihat contoh pola pengamat ini untuk detailnya.

Pola ini bagus ketika Anda ingin mendengarkan perubahan data pada suatu objek dan memperbarui tampilan UI lainnya secara bersamaan.

Tetapi Cons adalah Observable hanya memelihara satu array untuk menjaga pengamat (dalam contoh, array adalah observersList).

Ini TIDAK membedakan bagaimana pembaruan dipicu karena hanya memiliki satu notify function, yang memicu semua fungsi yang disimpan dalam array itu.

Jika kita ingin mengelompokkan pengamat penangan berdasarkan peristiwa yang berbeda. Kami hanya perlu mengubahnya observersListmenjadi Objectsejenis

var events = {
    "event1": [handler1, handler2],
    "event2": [handler3]
}

lihat contoh pubsub ini untuk detailnya.

dan orang menyebut variasi ini sebagai pub/sub. Jadi Anda dapat memicu berbagai fungsi berdasarkan yang eventsAnda terbitkan.


Nah ini adalah jawaban yang jauh lebih baik, ringkas dan jelas. :)
CoderX

Pada tingkat yang tinggi, saya selalu mengatakan bahwa pub sub adalah pola pengamat tetapi dengan semua itu memiliki rasa yang berbeda.
Grim

9

Saya setuju dengan kesimpulan Anda tentang kedua pola, namun bagi saya, saya menggunakan Observable ketika saya dalam proses yang sama dan saya menggunakan Pub / Sub dalam skenario antar-proses, di mana semua pihak hanya mengetahui saluran yang sama tetapi tidak semua pihak .

Saya tidak tahu pola lain, atau izinkan saya mengatakan demikian, saya tidak pernah membutuhkan pola lain untuk tugas ini. Bahkan sebagian besar kerangka kerja MVC dan implementasi pengikatan data biasanya menggunakan konsep pengamat secara internal.

Jika Anda tertarik pada komunikasi antar-proses, saya sarankan Anda:

"Pola Integrasi Perusahaan: Merancang, Membangun, dan Menyebarkan Solusi Perpesanan" - http://www.addison-wesley.de/9780321200686.html

Buku ini berisi banyak ide tentang cara mengirim pesan antar proses atau kelas yang dapat digunakan bahkan dalam tugas komunikasi intra-proses (membantu saya memprogram dengan cara yang lebih longgar).

Saya harap ini membantu!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.