C ++: il modo migliore per disporre di un repository di dati centrale

6

Sto codificando in C ++. Ho un server con cui i client si connetteranno e ogni client verrà scorporato nel proprio thread per la comunicazione. Questo server ospita un gioco, quindi ci sono informazioni che devono essere condivise tra tutti i thread client, così come ogni altro thread che scelgo di generare. Questi dati sono come i dati di livello, i giocatori online, ecc., Quindi tutte le discussioni potrebbero avere accesso a qualsiasi dato in qualsiasi momento. Quando stavo facendo questo in C #, ho appena avuto una statica con tutti i campi statici. C'è un modo migliore per farlo? Non voglio davvero dover gestire il passaggio di un riferimento a un oggetto specifico in ogni luogo, ma immagino che la mia attuale implementazione vada contro OOP, ecc. Sarebbe un buon esempio per l'utilizzo di un modello di progettazione singleton? Altre idee sono ben accette!

    
posta will 16.04.2012 - 22:28
fonte

4 risposte

2

3 modi principali per farlo:

  1. Usa un oggetto statico globale, che viene costruito all'avvio e può essere un buon esempio in quanto è molto semplice. Semplice può spesso = buono.

  2. Usa un singleton. Ora l'oggetto è stato creato in seguito e è ancora un singolo oggetto. si recupera questo oggetto secondo necessità. Questo è un "step-up" in quanto hai più controllo sull'inizializzazione dell'oggetto rispetto al globale.

  3. Utilizza un oggetto " Inversion of Control ". Questo è fondamentalmente il passaggio dell'oggetto in ogni classe nel costruttore, quindi ogni oggetto ha il suo puntatore membro privato all'oggetto. Questo è un altro step-up in quanto consente un accesso molto più facile al "globale", e consente anche di passare l'oggetto iniettato su una classe per classe.

In definitiva dipende, il modello IoC è molto di moda al momento, ma io tendo a preferire il TBH globale. Dipende anche da quali dati ci stai mettendo, e se è un oggetto di sola lettura o di lettura-scrittura.

    
risposta data 17.04.2012 - 01:27
fonte
4

I really don't want to have to deal with passing a reference to a specific object everywhere

Perché no? Passare un singolo riferimento così tanto? Domani ti darai un calcio quando utilizzi una variabile globale solo perché oggi eri troppo pigro per implementarlo correttamente.

Invia semplicemente il riferimento e fallo.

    
risposta data 16.04.2012 - 22:37
fonte
2

each client gets spun off into its own thread for communication

Non sei un fan di Boost.Asio?

there is information that must be shared between all client threads

Sembra che tu voglia solo una gigantesca tabella globale che ogni istanza client (sia che si tratti di un thread o di un'implementazione di Asio) può leggere e scrivere.

    
risposta data 16.04.2012 - 22:38
fonte
1

Ci sono un paio di altre opzioni non menzionate ancora: -

Memoria condivisa. Utilizzare le API di comunicazione interprete POSIX e memoria condivisa per allocare e controllare un pezzo di memoria condivisa. Il vantaggio è che ora puoi condividere i dati tra processi che scaleranno bene all'interno di una singola macchina.

Utilizzare un processo mini server, a cui è possibile accedere tramite la tecnologia prescelta (RPC, CORBA, semplici socket TCP / IP). Questo scalerà bene su più macchine, ma è necessario scrivere un'API abbastanza complessa per gestire gli aggiornamenti ecc.

Usa un database. Sembra eccessivo, ma questo è esattamente ciò per cui sono stati scritti i sistemi di gestione dei database. Questo ha dimensioni quasi pari a quelle di Facebook / Amazon a patto che tu stia attento con il tuo SQL e, per implementarlo, non è necessario scrivere molto codice.

    
risposta data 17.04.2012 - 06:14
fonte

Leggi altre domande sui tag