Voglio sapere come comportarmi quando hai alcuni stati in un programma, con funzioni che dipendono da loro, ma con un approccio immutabile. Ho letto alcuni esempi e domande, ma tutto si concentra su un piccolo scenario, voglio capirlo in un programma più grande, vicino al mondo reale.
La mia domanda non riguarda un linguaggio di programmazione o un paradigma (potrebbe essere fatto con Java per esempio, poiché non cambiamo i valori delle variabili), quindi illustrerò un semplice problema con questo pseudo codice:
--some states of my program
playerOne = {
cards :: [Card]
score :: Int
}
playerTwo = {
cards :: [Card]
score :: Int
}
tableCards :: [Card]
--a function that will perform a move in a game
--it needs to move a card from player to tableCards
--it needs to change the other player score with -1
doSomeMove()
--moves
doSomeMove(playerOne)
showScore() --p1: 10 p2: 9 tableCards: 1
doSomeMove(playerTwo)
showScore() --p1: 9 p2: 9 tableCards: 2
doSomeMove(playerOne)
showScore() --p1: 9 p2: 8 tableCards: 3
doSomeMove(playerTwo)
showScore() --p1: 8 p2: 8 tableCards: 4
Primo: in "doSomeMove ()" ho bisogno di leggere le carte di un giocatore. Dal momento che chiamerò questa funzione nel mezzo del gioco non posso leggere dalla variabile "playerOne", dato che è immutabile e non cambierà nel bel mezzo del gioco! Quindi, come posso risolvere questo? Per leggere gli stati attuali del programma attuale? devo ricevere sempre gli stati attuali delle carte giocatore per parametro?
Secondo: cambierò le carte (giocatore e tavolo) e gli altri giocatori in questa funzione. Dato che non posso davvero cambiare le variabili (dato che è immutabile) le clonerò e imposterò lo stato modificato in una variabile locale all'interno della funzione, giusto? Ma come può la prossima funzione (doSomeMove () o altri) conoscere questo cambiamento?
Fondamentalmente, l'unica cosa che posso pensare di risolvere è: ottenere l'intero stato del programma in base a parametri, apportare alcune modifiche e restituire tutto come parametro oltre all'utilizzo successivo della funzione e tenere conto delle modifiche di stato. Ma penso che questo sia molto poco pratico, dato che se ho 20 stati e 50 funzioni, ho bisogno di tutte e 50 le funzioni che passano e restituisco tutti e 20 gli stati ciascuno?
Non voglio risolvere questo problema, solo per capire come risolvere programmi come questo o più grandi con immutabilità. E spero che questa domanda aiuti un'altra persona, dal momento che ho chiesto ad alcune persone come risolvere questo problema e nessuno ha risposto sicuramente! Grazie!