5

Podczas tworzenia złożonej aplikacji JS, jakie są plusy i minusy korzystania z globalnego obiektu obserwatora, który uruchamia zdarzenia i który wszystkie inne obiekty subskrybują w porównaniu do mieszania lub prototypowania metody pub/sub na wszystkich obiektach odpowiedzialnych za wywoływanie własnych zdarzeń?Zalety/wady obiektu obserwatora globalnego vs. mieszanka

Weźmy na przykład gra w karty, która ma kupca, obiektów gracz i tabeli (psuedocode-owski następująco):

// "Global" observer version 

var observer = { 
    // publish and subscribe methods defined here 
}; 

dealer.deal = function(cards) { 
    // performs logic for dealing cards 
    observer.publish('dealer:dealt', cards, this); 
}; 

player.play = function(cards) { 
    // performs logic for which card is played 
    observer.publish('player:played', cards, this); 
}; 

table.showCards = function(cards, player) { 
    // performs logic for showing cards that the dealer dealt 
    // or that the player played 
}; 

observer.subscribe('dealer:dealt', table.showCards); 
observer.subscribe('player:played', table.showCards); 

vs

// Pub/sub mixin/prototype version 

dealer.deal = function(cards) { 
    // performs logic for dealing cards 
    this.publish('dealt', cards); 
}; 

player.play = function(cards) { 
    // performs logic for which card is played 
    this.publish('played', cards); 
}; 

table.showCards = function(cards) { 
    // performs logic for showing cards that the dealer dealt 
    // or that the player played 
}; 

dealer.subscribe('dealt', table.showCards); 
player.subscribe('played', table.showCards); 
+0

Którą drogą skończyłeś? Obecnie zmagam się z tą samą decyzją. Nawet rok po postawieniu pytania wydaje się, że nie ma jasnych danych, które mogłyby pomóc w wyborze. Globalne puli nawet wydaje się bardziej wolne i mniej intensywne pamięci, ale gdy systemy zaczynają być naprawdę ogromne, zastanawiam się, czy staną się po prostu skomplikowane. – nicholas

Odpowiedz

0

w twoich przykładów zarówno wydają ważnego wyboru, ale różnica może być widoczna w przypadku dynamicznych nazw wydarzeń (również dynamicznych nazw wydawców).

Korzystanie z globalnego nadajnika jest dobre, gdy trzeba subskrybować zdarzenia za pomocą wieloznacznika. Przykład:

eventEmitter.subscribe('*:delt', handler); 

Kolejna różnica polega na tym, że możesz mieć jedną zmienną zamiast 2,3 ... N, co jest lepsze dla pamięci, w którą wierzę.

+0

Miałem nadzieję na bardziej szczegółową odpowiedź z listą argumentów za i przeciw oraz niektórymi możliwymi danymi dotyczącymi wydajności, aby je zarchiwizować, ale ponieważ nikt inny nie odpowiedział, otrzymasz czek, ponieważ dostarczyłeś użytecznych informacji zwrotnych. Dzięki! – salmonete