Olay köpürme genellikle nasıl çalışır ve olay yayılımı ile eşanlamlı mıdır?


11

Olay odaklı (alt) sistemlerde olay gönderimi genel çalışmaları ve ilkeleri etrafında başımı sarmaya çalışıyorum.

Her ne kadar örneğin Javascript, Flash (Actionscript 2 ve 3) birkaç kez kullandım ve hatta bir kerede PHP'de basit bir olay gönderme sistemi yaptım, olay kabarcıklanma ve / veya gerçekten hiçbir zaman anlamadım iyi yayılım.

İlk soru:
Olay yayılımı, olay yayılımıyla eşanlamlı mı?

İkinci soru:
Anladığım kadarıyla, bir olay "patladığında", bunun nesnelerin hiyerarşisinde "taşındığı" anlamına geldiğini anlıyorum?

Üçüncü ve en önemli soru:
2. sorudaki anlayışım doğruysa; bu genel olarak nesnelerin hiyerarşisinde nasıl "hareket eder"?
Genellikle üst nesne "redispatches" aynı olay anlamına mı onun ebeveyni (kadar kök nesnesi ulaşır)? Ve öyle olsa bile; Hiyerarşideki tüm bu nesnelerin bu olaylar için çocuklarını dinlemesi mi gerekiyor, yoksa olay köpürme hakkındaki anlayışımda hayati bir şey eksik mi?

Bu basit ilkeleri basit bir sahte kodla açıklayabilirseniz minnettar olurum.


1
İlgili bir makale: Etkinlik siparişi
Jonas

Yanıtlar:


7

İlk soru: Olay yayılımı, olay yayılımıyla eşanlamlı mı?

Hayır. Kabarcıklanma bir olay yayılımı biçimidir, ancak eşanlamlı olarak kullanılamaz. Yayılma, bir olayı geçirmek için kullanılan genel bir terimdir. Köpürme, olayın yayılmasının özel bir stratejisidir.

İkinci soru: Anladığım kadarıyla, bir olay "patladığında", bunun nesnelerin hiyerarşisinde "taşındığı" anlamına geldiğini anlıyorum?

Evet. Köpürme , tünellemenin aksine hiyerarşiye çıktığı anlamına gelir, yani üst öğeden aşağıya veya yönlendirmeden gider , yani olayı almak için bir sonraki nesne seçtiğiniz herhangi bir şey olabilir.

Üçüncü ve en önemli soru: 2. sorudaki anlayışım doğruysa; bu genel olarak nesnelerin hiyerarşisinde nasıl "hareket eder"?

Çok kolay. Görsel hiyerarşinizde, kontroller ebeveynlerine / üst düzey görsellerine bir referansa sahiptir veya bir yerde elde edebilir. Dolayısıyla, bir olayı yakaladıklarında, ebeveynini olay hakkında bilgilendirir, bu da ebeveynini olay hakkında bilgilendirir.

Sözde Kod herhangi bir UI kontrolü için aşağıdaki gibidir:

OnEvent(SomeEvent event)
{
   CallHandlersForEvent(event);
   if(HasParent && event.ContinueBubbling == true)
   {
       Parent.OnEvent(event);
   }
}

Blueberryfields'in dediği gibi, bir sonraki etkinliği alan doğrudan ebeveyn olması gerekmiyor. Siz de böyle uygulayabilirsiniz:

OnEvent(SomeEvent event)
{
    CallHandlersForEvent(event);
    NextControl = VisualTree.GetVisualParent(this);
    if(NextControl != null && event.ContinueBubbling == true)
    {
       NextControl.OnEvent(event);
    }
}

+1 Sahte kod benim için çok anlamlı, teşekkürler! (Bu arada cevabınızın geri kalanı gibi.)
Decent Dabbler

@fireeyedboy: Rica ederim =)
Falcon

1

İlk cevap:

Olay köpürmesi, olayın yayılmasını yönlendiren belirli bir algoritmadır.

İkinci cevap:

Hayır, köpürme mutlaka herhangi bir hiyerarşi ile ilgili değildir. Nesnelerin dahili olarak veya başka bir yerde nasıl temsil edildiği, algoritmanın düzgün çalışması için önemli değildir. İdeal olarak, bir olay patladığında, ekrandaki en içteki elemandan, ekrandaki en dıştaki elemandan dışarı doğru genişler.

Üçüncü cevap:

Uygulama ayrıntıları, her birinin (tarayıcı) dahili bileşenlerinin nasıl uygulandığına bağlı olarak çok değişebilir. bubblingAlgoritma ekranda görseller bağlıdır. Bir kapsülleme elemanı kalıtım hiyerarşisinde bir iç elemandan daha yüksekse, köpürme, örneğin dilde standart kalıtım mekanizmaları kullanılarak uygulanabilir. Ancak bu her zaman doğru değildir - hem iç yapıları hem de ekrandaki görünürlüğünü yorumlayabilen ve iç organizasyonu göz ardı ederken olayları algoritmaya göre yayabilecek özel bir mekanizmaya sahip olabilirsiniz.


1
Neden söylüyorsunuz: "köpürme mutlaka herhangi bir hiyerarşiyle ilişkili değildir". Bence öyle. Hiyerarşi olmadan köpürme olmaz. Bir çeşit ağaç olmalı. Ağaç yapısı olmayan bir köpürme örneği söyleyebilir misiniz? "İçsel en dıştan görünür elemente" örneğiniz sadece - görsel bir hiyerarşi.
Falcon

1
Elbette, gerçekten isterseniz bir hiyerarşi olarak yorumlayabilirsiniz. Bunu, bazı görsel ve görsel olmayan unsurları içeren gevşek bağlı bir grafik olarak düşünmeyi tercih ediyorum.
blueberryfields

2
Ama sonra köpüren benzetme başarısız olur. Çünkü bir grafikte olay köpürme açıkça aşağıdan yukarıya doğru giderken herhangi bir yere yönlendirilebilir.
Falcon

Sanırım artık keyfi bir grafikte kabarcıklanma diyemezsiniz. Buna "olay yönlendirme" denir, sonra imho.
Falcon

1
Falcon'un bazı adil puanlar verdiğine inanıyorum. Köpürmenin yukarı doğru hareket eden bir şey (hiyerarşi) olduğunu düşünmek mantıklı geliyor.
Terbiyeli Dabbler
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.