Sto lavorando a un tipo di protocollo client-server in questo momento in Ruby. Ho avuto un problema in cui non sono del tutto sicuro su come procedere. Attualmente, ho una classe, Remote che indica una connessione remota (da utilizzare tramite EventMachine). Quando Remote riceve un messaggio (cioè, pacchetto di rete), lo invia a MessageDecoder , che restituisce il messaggio decodificato in un hash, in questo modo (pseudo-codice in anticipo)
{ source = <the_remote_connection>,
message_code = 1, // An operation code that indicates how to respond to this message
payload = {
packet_specific_key = packet_specific_value // provided by the decoder
}
}
Quindi, quando ritorno da MessageDecoder , Remote lo spedisce alla sua ConnectionListener , che deve decidere come distribuire quel messaggio attraverso l'applicazione. Ecco il problema: ogni messaggio potrebbe richiedere un diverso ambito di variabili. Ad esempio, uno potrebbe richiedere l'istanza di un oggetto World di cui ConnectionListener non è a conoscenza (e, giustamente, non dovrebbe - il codice di rete non dovrebbe essere accoppiato al resto del programma)
Quindi la mia domanda è: come posso implementare un sistema liberamente accoppiato per distribuire la ricezione di messaggi ignoranti dalla rete da una connessione remota nella mia applicazione che in qualche modo conserva magicamente gli ambiti?
MODIFICA: per commenti, esempio.
Supponiamo di avere un oggetto World . Il World conosce le entità al suo interno: rocce, alberi, si ottiene l'idea generale. Quindi, arriva un comando dal Remote che dice :DestroyRock - che dovrebbe invocare World#destroy_rock . Il World non dovrebbe sapere dove viene il comando a :DestroyRock . Dovrebbe solo sapere che World#destroy_rock è stato invocato su di esso.
Il problema è che ho bisogno di trovare un intermediario tra ConnectionListener e World#destroy_rock . ConnectionListener sicuramente non dovrebbe conoscere l'oggetto World , perché se lo è, significa che ora ho accoppiato il mio codice network al mio gameplay logica .. funziona. È piuttosto brutto.