Bir olay dinleyici modelinin gerekli olduğuna dair bir belirti olan “kod kokuları” nelerdir?


10

Kod tabanında olay dinleyici yaklaşımının gerekli olduğunu gösteren belirtiler nelerdir?

Bana öyle geliyor ki, diğer sınıfların tasarım zamanında tanımlanmayan, çoklu tarafından çağrılması gereken sınıflar olduğunda, bir çeşit sinyalleme çerçevesine ihtiyacınız var, ancak başka hangi durumların olacağını duymak istiyorum. olaya dayalı bir modele geçerek geliştirildi.

Yanıtlar:


8

Olay / Dinleyici yaklaşımı sıkı bağlantıdan kaçınmaya çalışır , bu nedenle bunu belirten tüm kod kokuları, atanmaya işaret eder.

Buna dayanarak, aşağıdaki belirtileri öneririm:

  • her yapının diğer her nesneyi bilmesi gerektiği için büyük yapıcılar vardır ve onsuz çalışamaz. Belki obj.set_dependecy(x)de yapıcı çağrısının hemen ardından gizlenmişti .

  • iki yönlü bağımlılıklar , çünkü olaylar olmadan, zorunlu bir dilde, bilgi akışı temelde 'itme'dir (birileri yöntemi çağırır)

  • 'bilgi hiyerarşisini' belirlemek zordur . Bu, çift ​​yönlü bağımlılıklar , sadece başka bir odak noktası: A varsa, B'yi dinleyen, B'yi B bilir, ancak B A'yı bilmez, bu yüzden bir 'hiyerarşi' vardır: bazı nesneler hiçbir şey bilmez, bazıları diğerlerini bilir Örneğin, MVC'yi şu şekilde uygularken: http://en.wikipedia.org/wiki/Model_View_Controller , model yalnızca kendisini bilir, görünüm modeli ve denetleyici görünümü ve modeli bilir.


1
İki yönlü bağımlılıklar, olay odaklı bir modele geçmeniz gereken en açık işarettir. Yapıcı şişkinlik bu anlamına gelebilir, ancak çoğu zaman sadece toplama, kompozisyon ve / veya genel soyutlama (yani tasarım değişiklikleri değil yeniden düzenleme) yolunda daha fazlasını yapmanız gerektiği anlamına gelmez.
Aaronaught

Haklısın. Algılama kolaylığı ile sipariş etmeye çalıştım ve büyük inşaatçılar çok basit, düzenli ifadelerle yakalanabilirler.
keppla

6

Bir dizi mesaja / sinyale / olaya neyin tepki vermesi gerektiğini bilmiyorsanız veya bilmemeniz gerektiğinde.

Çoğu zaman "dünya" nın bir modülde (bir sınıf ya da bir sınıflar sistemi) gerçekleşen bir şey hakkında bilmesini istediğinizde, ama ne denir diye uğraşmak istemezsiniz.

İlişkili kod kokusu, spesifik olarak, bağımsız modüllerden kod karıştırmaya başladığınızı hissettiğinizde, biri diğerinin tepki vermesi gereken bir şey yapıyor. Modül A'nın durumuna / olaylarına bağlı olarak B modülünden kod çağırmanız gerektiğini gördüğünüzde, olay dinleyicilerine ihtiyacınız vardır.


3

Sorunuzu değiştirir ve şunu söylerdim: bir olaya dayalı bir nesne tabanlı uygulama için doğru çözüm olmadığında? Etkinlik üreticileri ve tüketicileri olarak tasarlandıklarında çoğu OO uygulamasının fayda sağlayabileceğini düşünüyorum.

Sonunda, bir "yöntem çağrısı" aslında bir nesneye gelen bir mesajdır ve nesne mesajla bir şey yapıp yapmayacağına karar vermek ve işlemi gerçekleştirmekle sorumludur. Bu, Java gibi güçlü yazılan dillerde çok açık değildir, ancak Ruby gibi dinamik dillerde daha belirgin hale gelir.

Bir uygulamayı olay tabanlı olarak tasarlamanın bir başka ilginç noktası, genellikle dahili bileşenlerin düzgün bir şekilde izole edilmesi ve tutarlı olması gerektiğidir, aksi takdirde kod çok, çok hızlı bir şekilde karışıklık haline gelir. Örnek olarak, Alistair Cockburn tarafından kullanılan Altıgen Mimari kavramını gerçekten seviyorum , çünkü genellikle bu desen daha iyi bir kapsülleme oluşturur ve (benim görüşüme göre) daha uyumlu bileşenleri zorlar.

Bence (ama muhtemelen yanılıyorum) Bu ayrıca Domain Driven Design konsepti ile ilişkili olduğunu Domain Olaylar alanı sınıfları diğer nesneler tarafından yakalanır olayları yayarlar ki, ve bu nesne yayarlar henüz diğer olaylar (nerede bakınız bu gidiyor: D). Bu model hakkında sevdiğim şey, arayüzlerin uygulamaları değil Rolleri modellemesi gerektiğini söylüyor.

Çok mantıklı değilsem, son birkaç aydır bu kalıpları harika sonuçlar ile deniyorum ama yine de kavramları ve ne kadar uzağa ulaştıklarını anlamaya çalışıyorum.


2

Olay dinleyicileri (yani Gözlemci Deseni) olmasaydı ne yapmanız gerektiğini düşünün.

Diğer nesnelerin listesine başvuruda bulunan ve işlemin belirli bir noktasında bunlara yöntem çağıran bir nesneniz varsa, kesinlikle orada bir olay olması gerekirdi.

Bir nesnenin üzerinde bir şey yapıldığını söyleyen bir işaretiniz varsa ve o bayrağı başka nesnelerden izliyorsanız, kesinlikle olay güdümlü bir model kullanmalısınız.

Ancak, bunu bir geri arama ile karıştırmayın. Belirli bir zamanda geri çağırmak için başka bir nesneye yöntem çağırıp bu nesneyi kaynak nesneye iletirseniz, bir olay dinleyicisi kullanmak yerine bu şekilde bırakmalısını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.