Gözlemci, Pub / Sub ve Veri Bağlama arasındaki fark


163

Gözlemci Düzeni , Yayınlama / Abone Olma ve Veri Bağlama arasındaki fark nedir ?

Stack Overflow üzerinde biraz araştırdım ve iyi bir cevap bulamadım.

Ne inanıyorum veri bağlama genel bir terimdir ve gözlemci desen veya Pub / Sub desen gibi bunu uygulamak için farklı yollar vardır. Gözlemci modeli ile Gözlemlenebilir, Gözlemcilerini günceller. Pub / Sub ile, 0-çok yayıncı belirli sınıfların mesajlarını yayınlayabilir ve 0-çok abone belirli sınıfların mesajlarına abone olabilir.

"Veri bağlama" uygulamasının başka şekilleri var mı?


Başka bir tane buldum: Angular.js'nin yaptığı kirli kontrol . Daha fazla bilgi için burayı tıklayın: stackoverflow.com/questions/9682092/databinding-in-angularjs
Jess

Yanıtlar:


143

İşte bu üçü benim almam:

Bağlanma verileri

Esasen, özünde bu sadece "X nesnesindeki X özelliğinin değeri semantik olarak B nesnesindeki A özelliğinin değerine bağlıdır. Y'nin B nesnesindeki değişiklikleri nasıl bildiğine veya beslediğine dair hiçbir varsayım yapılmaz.

Gözlemci veya Gözlemlenebilir / Gözlemci

Bir nesnenin, diğerlerini belirli olayları bildirme yeteneğine sahip olduğu bir tasarım deseni - tipik olarak, belirli bir işlev / yöntemin şekliyle nesnedeki benzer yuvalar olan gerçek olaylar kullanılarak yapılır. Gözlemlenebilir bildirim yapan kişidir ve gözlemci bu bildirimleri alır. .Net'te, gözlemlenebilir bir olay gösterebilir ve gözlemci "olay işleyici" biçimli bir kanca ile o etkinliğe abone olur. Bildirimlerin meydana geldiği özel mekanizma veya gözlemlenebilir bir kişinin bildirebileceği gözlemci sayısı hakkında herhangi bir varsayım yapılmamıştır.

Pub / Sub

Gözlemlenebilir / Gözlemci modelinin genellikle daha "dinamik" bir lezzet ifade eden başka bir adı (belki de daha "yayın" anlambilimiyle) - gözlemciler bildirimlere abone olabilir veya abonelikten çıkabilir ve bir gözlemlenebilir birden çok gözlemciye "ses çıkarabilir". Olaylarda bir MulticastDelegate biçimi olduğu için .NET'te standart etkinlikler kullanılabilir ve bu nedenle birden çok aboneye etkinlik teslimini destekleyebilir ve ayrıca aboneliği iptal edebilirsiniz. Pub / Sub, belirli bağlamlarda biraz farklı bir anlama sahiptir, genellikle olay ve eventer arasında daha fazla "anonimlik" içerir, bu da genellikle her şeyi bilen bazı "orta adamı" (mesaj kuyruğu gibi) içeren herhangi bir sayıda soyutlama ile kolaylaştırılabilir. ancak bireysel partiler birbirlerini bilmezler.

Veri Bağlama, Redux

Birçok "MVC benzeri" desende, gözlemlenebilir özellik de değiştirilen belirli özellik hakkında bilgi içeren bir tür "özellik değiştirilmiş bildirim" ortaya koyar. Gözlemci örtüktür, genellikle çerçeve tarafından oluşturulur ve belirli bir nesneyi ve özelliği tanımlamak için bazı bağlayıcı sözdizimi yoluyla bu bildirimlere abone olur ve "olay işleyici" yeni değeri kopyalar, herhangi bir güncelleme veya yenileme mantığını potansiyel olarak tetikler.

Veri bağlama yeniden Redux

Veri bağlama için alternatif bir uygulama? Tamam, işte aptalca:

  • bir nesnenin bound özelliğini sürekli kontrol eden bir arka plan iş parçacığı başlatılır.
  • bu iş parçacığı, son kontrolden bu yana özellik değerinin değiştiğini algılarsa, değeri ilişkili öğeye kopyalayın.

Cevabınızı takdir ediyorum ve farklı bir veri bağlama fikri uygulamaya çalışıyorum.
Jess

@ jessemon heh, sorun değil; gözlemci modeli kesinlikle bildiğim "soyut olarak en iyi" yaklaşımdır, ama korkunç küçük örneğim de kaotik ve verimsiz bir şekilde de olsa "veri bağlama" yapar.
JerKimball

7
Dürüst olmak gerekirse, "pub / sub aka gözlemci modeli" duymaktan bıktım, hepsi aynı şey değil. Pub / sub bir olay sistemidir; gözlemci modeli , nesnenin değişmesi durumunda olayları OTOMATİK OLARAK yayınlamak için bir olay sistemi kullanır . Bir nesneyi değiştirdiğinizde olayları el ile yayınlıyorsanız, gözlemci desenini kullanmazsınız.
BT

154

Gözlemci / Gözlemlenebilir ve Yayıncı / Abone kalıpları arasında iki büyük fark vardır:

  1. Gözlemci / Gözlemlenebilir model çoğunlukla eşzamanlı olarak uygulanır , yani gözlemlenebilir bir olay meydana geldiğinde tüm gözlemcilerinin uygun yöntemini çağırır. Yayıncı / Abone model çoğunlukla uygulanan asenkron (mesaj kuyruğu kullanarak) yolu.

  2. In Gözlemci / Gözlenebilir desen, gözlemciler gözlenebilir farkında . Oysa Yayıncı / Abone'de yayıncıların ve abonelerin birbirlerini tanımasına gerek yoktur . Sadece mesaj kuyruklarının yardımıyla iletişim kurarlar.

Doğru belirttiğiniz gibi, veri bağlama genel bir terimdir ve Gözlemci / Gözlemlenebilir veya Yayıncı / Abone yöntemi kullanılarak uygulanabilir. Veriler Yayıncı / Abone.


7
Ben okuyordum JavaScript Web Uygulamaları O'Reilly (tarafından shop.oreilly.com/product/0636920018421.do ). Bölüm 2'de Alex pub/subJS kullanarak olayları uygular . Bu bir geri arama uygulamasıdır, ancak eşzamanlı bir örnektir.
Jess

5
Kitabı okumadım ama JS "olaylar" kullanılarak uygulanmış olsaydı, olaylar tanım gereği zaman uyumsuz olduğu için zaman uyumsuz olurdu.
Param

3
Merhaba Jess, elbette haklısın. Bu terimler için standart bir tanım yoktur 😊
Param

14
Genellikle bir gözlemlenebilir, onunla bir gözlemci listesine sahiptir (hepsine bir olay göndermek için bu listeyi tekrarlar). Bir yayıncı genellikle yalnızca olaylarını / iletilerini yayınladığı bir kuyruğun farkındadır. Bu kuyruğa kaç müşterinin abone olduğunu bilmiyor.
Param

7
Benim için bu ikisi arasındaki kritik fark: Ayrıca gözlemci modelinde gözlemciler gözlemlenebilir olanın farkındalar. Oysa Pub / Sub'da ne yayıncıların ne de tüketicilerin birbirlerini tanıması gerekmiyor. Sadece mesaj kuyruklarının yardımıyla iletişim kurarlar. Mükemmel cevap!
maryisdead

23

Buradaki tüm cevapların Gözlemci ve Pub / Sub örüntüleri arasındaki ince farkı somut örnekler vermeden açıklamaya çalıştığı konusunda biraz eğlendim. Bahse girerim ki okuyucuların çoğu hala birini eşzamanlı ve diğeri eşzamansız okuyarak her birinin nasıl uygulanacağını bilmiyorlar.

Unutulmaması gereken bir nokta: Bu kalıpların amacı kodu ayırmaya çalışmak

Gözlemci, bir nesnenin (özne olarak bilinir) ona bağlı olarak nesnelerin bir listesini (gözlemciler) tuttuğu ve durumdaki değişiklikleri otomatik olarak bildirdiği bir tasarım modelidir.

Gözlemci modeli

Bu, observable objecta'nın tüm listesini koruduğu bir listeye sahip olduğu anlamına gelir .observers (genellikle işlevler olan) . ve bu listede gezinebilir ve iyi hissettirdiğinde bu işlevleri çağırabilir.

bkz bu gözlemci desen detaylar için Örnek.

Bir nesnedeki herhangi bir veri değişikliğini dinlemek ve diğer UI görünümlerini buna göre güncellemek istediğinizde bu model iyidir.

Ancak Eksileri Gözlemlenebilir, gözlemcileri tutmak için sadece bir dizi korur (örnekte, diziobserversList ).

Bu notify functiondizide depolanan tüm işlevleri tetikleyen yalnızca bir tane olduğundan güncellemenin nasıl tetiklendiğini ayırt ETMEZ .

Gözlemcilerin işleyicilerini farklı olaylara göre gruplandırmak istiyorsak. Bunu sadece observersListbir Objectbenzeri gibi değiştirmemiz gerekiyor

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

bkz bu PubSub örneği detaylar için.

ve insanlar bu varyasyonu olarak adlandırıyorlar pub/sub. Böylece, eventsyayınladığınıza bağlı olarak farklı işlevleri tetikleyebilirsiniz .


Bu çok daha iyi, özlü ve açık bir cevap. :)
CoderX

Yüksek düzeyde her zaman pub altının gözlemci modeli olduğunu söyledim ama her şeyi ile farklı tatlar var.
Grim

9

Yine de benim için her iki örüntüyle ilgili varılan sonuca katılıyorum, aynı süreçteyken Gözlemlenebilir'i kullanıyorum ve tüm tarafların yalnızca ortak kanalı bildikleri, ancak tarafların değil ortak süreçleri bildikleri süreçler arası senaryolarda Pub / Sub kullanıyorum .

Başka kalıpları bilmiyorum ya da bu şekilde söyleyeyim, bu görev için asla başka kalıplara ihtiyacım olmadı. Çoğu MVC çerçevesi ve veri bağlama uygulamaları bile genellikle dahili olarak gözlemci kavramını kullanır.

İşlemler arası iletişim ile ilgileniyorsanız size tavsiye ederim:

"Kurumsal Entegrasyon Kalıpları: Mesajlaşma Çözümleri Tasarlama, Oluşturma ve Dağıtma" - http://www.addison-wesley.de/9780321200686.html

Bu kitap, süreç içi iletişim görevlerinde bile kullanılabilecek işlemler veya sınıflar arasında nasıl mesaj gönderileceği hakkında birçok fikir içeriyor (daha gevşek bir şekilde programlamama yardımcı oldu).

Umarım bu yardımcı olur!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.