Attualmente sto lavorando su un motore voxel (simile a Minecraft) in C ++. Quasi tutto il codice (cioè la generazione del mondo, il rendering, l'input dell'utente) deve accedere ai dati relativi ai tipi di blocco. Per fare ciò, ho creato una classe BlockRegistry con funzioni membro per registrare e accedere alle istanze BlockType. Ogni istanza di BlockType ha funzioni membro per accedere a tutte le sue proprietà (ad es. Trame, forma). Il problema che sto avendo è assicurarsi che tutte le parti del codice abbiano accesso a questa classe. In questo momento sto passando un puntatore ad esso, ma questo aumenta notevolmente l'accoppiamento poiché, ad esempio, se una classe b fornisce qualcosa di cui una classe ha bisogno, e la classe b deve accedere al registro di blocco, devo modificare la classe a e ovunque io usi la classe a per passare attraverso.
Il mio primo pensiero è stato quello di usare il modello singleton (o una classe con tutti i membri statici), ma, da quello che capisco, un pattern singleton dovrebbe essere usato solo se il singleton non ha uno stato, il che non è il caso perché BlockRegistry memorizza un elenco di blocchi modificabile. Rendere immutabile questo elenco di blocchi non è un'opzione, poiché ciò rende impossibile il supporto di mod. Inoltre, se, in qualche modo, diverse istanze del gioco finiscono nell'esecuzione nello stesso processo e richiedono BlockRegistries separate, questo sarebbe un incubo da considerare. Dovrei anche preoccuparmi di questo?
L'altra opzione che sto pensando è di avere una singola classe "principale" con membri per BlockRegistry, World (fondamentalmente un array paginato infinito per memorizzare tutti i dati nel mondo di gioco), il motore OpenGl e altro funzioni comunemente usate, nel qual caso posso passare un puntatore alla mia classe principale in giro. Passerei quindi un puntatore a questa classe intorno a tutte le parti del programma, poiché aggiungere nuove classi di uso comune è semplice come aggiungere un membro a questa classe principale. Questo risolve anche il problema di avere più istanze del motore voxel nello stesso processo.
Quando ho una classe a cui ho bisogno di accedere a molte parti del programma, dovrebbe essere un singleton o essere trasmesso con una classe principale? Se dovrebbe essere un singleton, dovrei farlo sotto forma di una classe statica o di un singolo singleton?