Esta é principalmente uma questão teórica sobre FP, mas vou fazer aventuras em texto (como Zork da velha escola) para ilustrar meu argumento. Eu gostaria de saber suas opiniões sobre como você modelaria uma simulação estável com o FP.
As aventuras em texto realmente parecem exigir POO. Por exemplo, todas as "salas" são instâncias de uma Room
classe, você pode ter uma Item
classe básica e interfaces como Item<Pickable>
as que você pode carregar e assim por diante.
A modelagem do mundo no FP funciona de maneira diferente, especialmente se você deseja imutar um mundo que deve sofrer mutações à medida que o jogo avança (objetos são movidos, inimigos são derrotados, a pontuação aumenta, o jogador muda sua localização). Eu imagino um único objeto grande World
que tem tudo: quais são as salas que você pode explorar, como elas estão conectadas, o que o jogador está carregando, quais alavancas foram acionadas.
Penso que uma abordagem pura seria basicamente passar esse grande objeto para qualquer função e devolvê-lo (possivelmente modificado). Por exemplo, eu tenho uma moveToRoom
função que obtém World
e retorna com a World.player.location
alteração para a nova sala, World.rooms[new_room].visited = True
e assim por diante.
Mesmo que este seja o caminho mais "correto", parece estar impondo pureza por causa disso. Dependendo da linguagem de programação, passar esse World
objeto potencialmente muito grande para frente e para trás pode ser caro. Além disso, todas as funções podem precisar ter acesso a qualquer World
objeto. Por exemplo, uma sala pode estar acessível ou não, dependendo de uma alavanca acionada em outra sala, porque pode ser inundada, mas se o jogador carregar um colete salva-vidas, ele poderá entrar de qualquer maneira. Um monstro pode ser agressivo ou não, dependendo de o jogador ter matado seu primo em outra sala. Isso significa que a roomCanBeEntered
função precisa acessar World.player.invetory
e World.rooms
, describeMonster
precisa acessar World.monsters
e assim por diante (basicamente, você devepasse toda a carga). Isso realmente me parece exigir uma variável global, mesmo que seja apenas um bom estilo de programação, especialmente no FP.
Como resolveria este problema?