Questa è principalmente una domanda teorica sulla FP, ma prenderò delle avventure testuali (come Zork della vecchia scuola) per illustrare il mio punto. Mi piacerebbe conoscere le tue opinioni su come modellerai una simulazione stateful con FP.
Le avventure testuali sembrano davvero richiedere OOP. Ad esempio, tutte le "stanze" sono istanze di una classe Room
, puoi avere una classe base Item
e interfacce come Item<Pickable>
per le cose che puoi trasportare e così via.
La modellazione del mondo in FP funziona in modo diverso, specialmente se si vuole rafforzare l'immutabilità in un mondo che deve mutare mentre il gioco procede (gli oggetti vengono mossi, i nemici vengono sconfitti, il punteggio aumenta, il giocatore cambia la sua posizione). Immagino un unico grande oggetto World
che ha tutto: quali sono le stanze che puoi esplorare, come sono collegate, cosa sta portando il giocatore, quali leve sono state attivate.
Penso che un approccio puro sarebbe fondamentalmente passare questo grande oggetto a qualsiasi funzione e farlo restituire da esso (eventualmente modificato). Ad esempio, ho una funzione moveToRoom
che ottiene World
e la restituisce con World.player.location
cambiata nella nuova room, World.rooms[new_room].visited = True
e così via.
Anche se questo è il modo più "corretto", sembra imporre la purezza per il gusto di farlo. A seconda del linguaggio di programmazione, il passaggio di questo oggetto World
potenzialmente molto grande avanti e indietro può essere costoso. Inoltre, potrebbe essere necessario che la funzione ogni abbia accesso a qualsiasi oggetto World
. Ad esempio, una stanza può essere accessibile o meno a seconda di una leva innescata in un'altra stanza perché potrebbe essere allagata, ma se il giocatore porta un salvagente, può entrarci comunque. Un mostro può essere aggressivo o meno a seconda che il giocatore abbia ucciso suo cugino in un'altra stanza. Ciò significa che la funzione roomCanBeEntered
deve accedere a World.player.invetory
e World.rooms
, describeMonster
deve accedere a World.monsters
e così via (in pratica, deve passare l'intero carico intorno). Mi sembra davvero di chiedere una variabile globale, anche se questo è tutto tranne uno stile di programmazione buono in FP.
Come risolveresti questo problema?