Il s'agit principalement d'une question théorique sur la PF, mais je vais prendre des aventures textuelles (comme la vieille école de Zork) pour illustrer mon propos. J'aimerais connaître votre opinion sur la façon dont vous modéliseriez une simulation avec état avec FP.
Les aventures textuelles semblent vraiment appeler la POO. Par exemple, toutes les "salles" sont des instances d'une Room
classe, vous pouvez avoir une Item
classe de base et des interfaces comme Item<Pickable>
pour les choses que vous pouvez transporter et ainsi de suite.
La modélisation des mondes dans FP fonctionne différemment, surtout si vous voulez imposer l'immuabilité dans un monde qui doit muter au fur et à mesure que le jeu progresse (les objets sont déplacés, les ennemis sont vaincus, le score augmente, le joueur change d'emplacement). J'imagine un seul grand objet World
qui a tout: quelles sont les pièces que vous pouvez explorer, comment elles sont liées, ce que le joueur porte, quels leviers ont été déclenchés.
Je pense qu'une approche pure serait de passer ce gros objet à n'importe quelle fonction et de le faire retourner par eux (éventuellement modifié). Par exemple, j'ai une moveToRoom
fonction qui l'obtient World
et la renvoie avec une World.player.location
modification dans la nouvelle pièce, World.rooms[new_room].visited = True
etc.
Même si c'est la manière la plus "correcte", cela semble être une pureté pour le plaisir. Selon le langage de programmation, le passage de cet World
objet potentiellement très gros dans les deux sens peut être coûteux. En outre, chaque fonction peut avoir besoin d'avoir accès à n'importe quel World
objet. Par exemple, une pièce peut être accessible ou non selon un levier déclenché dans une autre pièce car elle peut être inondée, mais si le joueur porte un gilet de sauvetage, il peut y entrer quand même. Un monstre peut être agressif ou non selon que le joueur a tué son cousin dans une autre pièce. Cela signifie que la roomCanBeEntered
fonction a besoin d'accéder World.player.invetory
et World.rooms
, a describeMonster
besoin d'accéder World.monsters
et ainsi de suite ( en gros, vous devezfaire passer toute la charge). Cela me semble vraiment appeler une variable globale, même si c'est tout sauf un bon style de programmation surtout en FP.
comment résoudrais-tu ce problème?