これは主にFPに関する理論的な質問ですが、私のポイントを説明するためにテキストアドベンチャー(古い学校のZorkなど)を取り上げます。FPを使用してステートフルシミュレーションをどのようにモデル化するかについて、ご意見をお聞かせください。
テキストアドベンチャーには、本当にOOPが必要です。たとえば、すべての「部屋」はRoom
クラスのインスタンスであり、基本的なItem
クラスとItem<Pickable>
持ち運びできるものなどのインターフェイスを持つことができます。
FPでのワールドモデリングの動作は異なります。特に、ゲームの進行(オブジェクトの移動、敵の敗北、スコアリングの増加、プレイヤーの位置の変更)に応じて変化する必要があるワールドに不変性を適用する場合。私World
はそれをすべて備えた単一の大きなオブジェクトを想像します。探索できる部屋は何か、それらはどのようにリンクされているか、プレイヤーは何を運んでいるか、どのレバーがトリガーされたか。
純粋なアプローチは、基本的にこの大きなオブジェクトを任意の関数に渡し、それらによって返される(おそらく変更される)ことだと思います。例えば、私は新しい部屋に変更されてそれをmoveToRoom
取得World
して返す関数を持っています。World.player.location
World.rooms[new_room].visited = True
これがより「正しい」方法であっても、そのために純粋さを強制しているようです。プログラミング言語によっては、この潜在的に非常に大きなWorld
オブジェクトをやり取りするのに費用がかかる場合があります。また、すべての関数がWorld
オブジェクトにアクセスする必要がある場合があります。たとえば、部屋は浸水する可能性があるため、他の部屋でトリガーされたレバーに応じてアクセス可能またはそうでない場合がありますが、プレイヤーがライフジャケットを持っていれば、とにかく入ることができます。モンスターはプレイヤーが別の部屋でいとこを殺害したかどうかによって攻撃的であるかもしれません。この手段roomCanBeEntered
の機能は、アクセスする必要があるWorld.player.invetory
とWorld.rooms
、describeMonster
アクセスする必要があるWorld.monsters
ので、(基本的に、あなたがしなければなりません負荷全体を渡します)。これは、特にFPのプログラミングスタイルが優れている場合でも、グローバル変数を呼び出すように思えます。
この問題をどのように解決しますか?