Come evitare lo stato globale con una mappa del mondo?

0

Questo è un problema concettuale con cui ho difficoltà generali, e mi piacerebbe guardare un esempio che si spera possa aiutare a chiarire questo: usare una mappa per rappresentare un mondo di gioco alterabile. Per semplicità, questa mappa può essere solo una matrice bidimensionale di ints. Mi sto avvicinando a questo da C # all'interno di Unity, se questo cambia qualcosa.

Lo stato globale è cattivo, o almeno lontano dall'ideale, è indirizzato qui: Perché lo stato globale è così malvagio? Comprendo concettualmente questi problemi che pone, ma non vedo come le alternative proposte in realtà risolvano questo problema. Il problema più grande sembra essere la mutabilità e le modifiche che creano instabilità nel codice.

Guardando il mio esempio di mappa, ci sono molti sistemi che potrebbero aver bisogno di accedere alla mappa: il rendering deve esaminare i dati e determinare quali sprite disegnare, l'input deve controllare i dati per determinare se determinati input sono validi , i dati della mappa potrebbero dover essere cambiati se una tessera viene distrutta o costruita, ecc. Il mio approccio più istintivo è quello di creare la mappa come un singleton che può quindi essere facilmente referenziato ovunque sia necessario. Ciò, tuttavia, crea ovviamente uno stato globale e diventa quindi un problema.

L'iniezione di dipendenza sembra essere il modo più comunemente referenziato per prevenire lo stato globale, ma non vedo come questo riduca o elimini lo stato globale. Dalla mia comprensione, invece di ottenere un riferimento alla mia mappa creando un singleton, passo invece al riferimento attraverso i costruttori. Ciò sembra funzionalmente identico a me: in entrambi i casi, tutto finisce con un riferimento allo stesso Stato Globale, tranne che DI ha quello che sembra essere uno svantaggio perché richiede passaggi aggiuntivi di parametri.

DI dovrebbe utilizzare solo lo stato copiato? In tal caso non ci sono prestazioni / impatti della memoria relativamente significativi nella duplicazione di così tanti dati? Ovviamente dal momento che sto imparando, posso probabilmente ignorare le prestazioni a meno che non diventi davvero un problema, ma questo mi sembra incredibilmente goffo e inefficiente.

Quindi, cosa mi manca del DI che lo rende una valida soluzione a questo problema? Quali soluzioni alternative esistono per affrontare effettivamente questo problema?

    
posta Aze 17.05.2018 - 22:40
fonte

1 risposta

3

Se hai solo una mappa e la passi in tutto, allora sì questo è funzionalmente equivalente a una variabile globale.

Ma c'è una differenza molto importante. Non sei forzato per avere solo una singola istanza.

Ad esempio, diciamo che hai un comportamento che mostra una vista mappa di alto livello del tuo mondo.

MapViewBehaviour_Global
{
    OnDraw()
    {
        draw(Game.Map) //static global variable
    }
}

o

MapViewBehaviour_DependencyInjection
{
    OnDraw()
    {
        draw(this.Map) //injected local variable
    }
}

Quindi, per iniziare, iniettare Game.Map nella versione DI e chiedersi perché si sta dando fastidio. Ma poi fai una schermata di caricamento del gioco in cui desideri visualizzare una mappa per ogni gioco salvato.

La tua versione DI gestisce facilmente dove cade la tua versione globale.

    
risposta data 18.05.2018 - 00:19
fonte

Leggi altre domande sui tag