5

Durante la creazione di un'applicazione JS complessa, quali sono i pro e i contro dell'uso di un oggetto observer globale che genera eventi e che tutti gli altri oggetti sottoscrivono rispetto a mixing o prototyping metodi pub/sub su tutti gli oggetti che sono responsabili dell'attivazione dei propri eventi?Pro/contro di un oggetto osservatore globale rispetto a un mixin

Prendiamo ad esempio un gioco di carte che ha commerciante, oggetti giocatore, e da tavolo (psuedocodarlo-ish segue):

// "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

Da che parte siete finiti? Sono attualmente alle prese con la stessa decisione. E anche un anno dopo aver posto la domanda sembra che non ci siano dati chiari là fuori per aiutare a fare la scelta. I pool pari globali sembrano più liberi e meno dispendiosi di memoria, ma quando i sistemi iniziano a diventare veramente enormi mi chiedo se diventerà semplicemente troppo difficile da gestire. – nicholas

risposta

0

Nei tuoi esempi entrambi sembrano una scelta valida, ma la differenza può essere vista quando si gestiscono nomi di eventi dinamici (anche nomi dinamici di "editore").

Quindi utilizzare un emettitore globale è utile quando è necessario abbonarsi agli eventi utilizzando un carattere jolly. Esempio:

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

Un'altra differenza è che è possibile avere una variabile anziché 2,3 ... N, che è meglio per la memoria, credo.

+0

Speravo in una risposta più approfondita con un elenco di pro/contro e alcuni dati sulle prestazioni possibili per eseguire il backup, ma poiché nessun altro ha risposto, si ottiene il controllo dal momento che ha fornito alcuni feedback utili. Grazie! – salmonete