Etkinlik zincirleme iyi bir uygulama olarak mı görülüyor?


15

Zaman zaman bir olayı tetiklemeden önce birkaç karmaşık koşulun karşılanması gereken senaryolarla karşılaştım. Dahası, dinleyicilerin çoğu aynı zamanda eylemin gidişatını belirlemek için ek kontroller yapar. Bu beni daha küçük olaylar açısından daha iyi bir çözüm düşünüp düşünmeyeceklerini ve birbirlerinin içinde tetiklenmelerine izin verip vermeyeceğimizi düşündürdü.

Zincirleme olayları, daha sonra oldukça düşük bir çaba ile (YAGNI? Kodum, başkalarının anlaması zor olmamalı, kolayca anlaşılan basit öğelerden oluşacaktır.

Bununla birlikte, bu çözümün olası dezavantajları, zincirde bir şeylerin yanlış gitmesi durumunda (örneğin, insan hatası nedeniyle yanlış olay tetiklemesi), hatayı yakalamak oldukça zor olacaktır.

Olay zincirleme iyi bir fikir TM mı? Değilse, olayla ilgili kodun karmaşıklaşmasını sağlamak için alternatif yöntemler nelerdir?


1
Son birkaç yıldır JavaScript için bir etkinlik zincirleme kütüphanesinde çalışıyorum. kayoub5.github.io/onQuery <br> (A veya B) sonra C sonra (D ve E) gibi karmaşık olayların yazılmasına izin verir {A + B} > C > {D & E}<br> Kesinlikle karmaşık çözümleri daha kısa sürede, ancak daha önce de belirtildiği gibi yazmaya yardımcı olur, test ve hata ayıklama hala bir acıdır.
Ayoub Kaanich

Yanıtlar:


11

Etkinlik zincirleme iyi bir fikir mi?

Siz kullanana kadar gerçekten iyi bir fikir gibi görünen şeylerden biri.

Siparişe bir tür zımni bağımlılık olmaksızın basamaklı olaylar oluşturmak çok zordur. Sonsuz döngüler ve ara sıra bellek sızıntıları nedeniyle sorunlara neden olmadan bunları ayarlamak zordur. Nereye ekleneceğini ve nereye basamaklandırılacağını bilmek isteyen olayların neden olduğu kuplaj nedeniyle sınıf tasarımını zorlaştırırlar.

Ve kod hakkında hata ayıklama ve akıl yürütme konusunda çok zorlar.

Şimdi bazen kod yapısının bu sorunların bazılarını sınırladığı nispeten sınırlı senaryolarda kullanılabilirler. Kullanıcı arayüzlerinde basamaklı olaylar, hiyerarşiyi tetiklemek için kullanılabilir, çünkü bu hiyerarşi yapısı sahiplik ve döngüsel endişeleri sınırlamaya yardımcı olur.

Yine de, günümüzde, bu tür genişletilebilir davranışlar için bir kurucuda bir temsilci kabul ettiğimde, çalışma sırasında keyfi davranışların sürmesine izin vermekten çok daha sık buluyorum.


Bazı büyük noktalar, özellikle UI hiyerarşileri ile ilgili.
vaughandroid

2

Etkinlik zincirleme iyi bir fikirdir.

  • Genelde senaryonuz için uygundur. Bunun basit bir örneği, kullanıcının diğer görsel olayları tetikleyen kullanıcı arayüzü eylemidir.
  • Her olay kendi kendine yeten ve yönetilebilir. Çözümün aşırı hantal olmasını istemezsiniz.
  • Kontrol akışını takip etmek kolaydır. Bir platformda ve bir geliştiricinin kolayca geçebileceği bir dilde uygulanması gerekir. Olanları takip etmek için "sihirli" yöntemleri izlemeniz gerekiyorsa, yanlış yola girersiniz.

Sistemi kurmaya başlamadan önce çözümü düşünmek ve bazı şeyleri genelleştirmek çok önemlidir. Örneğin, bir OO dilinde, tüm olayların temeli olarak temel bir arayüze veya soyut bir sınıfa sahip olmalısınız. Bu sınıf günlüğe kaydetme / hata ayıklama gibi şeyleri içermelidir. Ayrıca hataları zarif bir şekilde işlemek için genelleştirilmiş bir olay yönetimi sınıfı da isteyebilirsiniz.


2

Bir zamanlar olay zinciri ile ilgili bir hatayı izlemek için birkaç gün geçiren birinin bakış açısından, bu Çok Kötü Bir Fikirdir (sm). (Belirttiğiniz gibi) hata ayıklamayı kabus haline getirebilecek kontrol akışınızı saklıyorsunuz. Birisi bir kontrolü sıfırlayan bazı hata işleme kodu eklediğimde bende durum ortaya çıktı. Bu onPropertyChange, hata işleyiciye sahip kontrolü yenileyen ve diğer kontrolü tekrar sıfırlamasına yol açan bir işleyici zincirine yol açtı. Temel olarak, arayüz% 100 sabitlenmiş CPU ile kilitlenir.

Olay işleyicilerinin aynı kök olay için birden fazla tetiklenmesini önlemenin bir yolu varsa, bundan kaçınabilirsiniz, ancak birden çok olay işleyicisi çağrısı isteyebileceğiniz durumlar hayal edebiliyorum.


1
Bu, genel olarak konseptte değil, belirli bir uygulamada bir sorun gibi görünüyor.
Matt S

Deterministik olmayan kontrol akışıyla ilgili sorunun tasarımın doğasında olduğunu düşünüyorum. Çok spesifik akışları kodlamadığınız ve genel amaçlı bir pub / alt tip mekanizması kullanmadığınız sürece.
TMN

2

Olay zincirinin iyi uygulanması, başkaları tarafından belirtilen tüm nedenlerle zordur.

Ancak, aynı zamanda çoğu kural motorunun temel dayanağıdır. JBoss Drools, IBM jRules, PegaSystems, Corticon ve FICO Blaze Danışmanı, kullanıcıların sistemlerde meydana gelen olaylara dayalı olarak tetiklenen kuralları bildirmelerine olanak tanıyan başlıca İş Kuralları Yönetim Sistemleri'dir (BRMS). Hem ileri hem de geri zincirleme mümkündür ve yapılabilir.

Prolog dili ve türevleri aynı düşünceye dayanmaktadır.

İlgili algoritmalar basit değildir, hata ayıklama bir ağrı olabilir, ancak modelde çok fazla değer bulunur.


1

Potansiyel bir dezavantaj, yanlışlıkla döngüsel güncellemelerle sonuçlanmasının oldukça kolay olmasıdır. örneğin A -> B -> C -> A -> B ...

Başka bir yaklaşım, bir dizi olayı tetiklemekten sorumlu kompozit olaylar oluşturmaktır. Bu, bir döngüye takılı kalmamanız gerektiği anlamına gelir ve hataları / vb. Yakalamak için size tek bir yer verir. Bu konuda bazı başarılar elde ettim, ancak kuşkusuz bunu özellikle karmaşık bir şey için kullanmadı (henüz!).

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.