Jest to głównie teoretyczne pytanie o FP, ale wezmę udział w tekstowych przygodach (takich jak oldschoolowy Zork), aby zilustrować mój punkt widzenia. Chciałbym poznać twoje opinie na temat tego, jak modelowałbyś stanową symulację z FP.
Wydaje się, że przygody tekstowe wymagają OOP. Na przykład wszystkie „pokoje” są instancjami Room
klasy, możesz mieć Item
klasę podstawową i interfejsy, takie jak Item<Pickable>
rzeczy, które możesz nosić i tak dalej.
Modelowanie świata w FP działa inaczej, szczególnie jeśli chcesz wymusić niezmienność w świecie, który musi mutować w miarę postępów w grze (obiekty są przemieszczane, wrogowie są pokonani, liczba punktów rośnie, gracz zmienia lokalizację). Wyobrażam sobie jeden duży obiekt, World
który ma to wszystko: jakie pokoje możesz eksplorować, w jaki sposób są połączone, co niesie gracz, jakie dźwignie zostały uruchomione.
Myślę, że czystym podejściem byłoby po prostu przekazanie tego dużego obiektu do dowolnej funkcji i zwrócenie go (ewentualnie zmodyfikowanego). Na przykład mam moveToRoom
funkcję, która pobiera World
i zwraca ją wraz ze World.player.location
zmianą w nowym pokoju World.rooms[new_room].visited = True
i tak dalej.
Nawet jeśli jest to bardziej „poprawny” sposób, wydaje się, że egzekwuje czystość ze względu na to. W zależności od języka programowania przekazywanie tego potencjalnie bardzo dużego World
obiektu tam iz powrotem może być kosztowne. Ponadto każda funkcja może wymagać dostępu do dowolnego World
obiektu. Na przykład, pokój może być dostępny lub nie w zależności od dźwigni uruchomionej w innym pokoju, ponieważ może być zalany, ale jeśli gracz nosi kamizelkę ratunkową, może i tak wejść do niej. Potwór może być agresywny lub nie, w zależności od tego, czy gracz zabił swojego kuzyna w innym pokoju. Oznacza to, że roomCanBeEntered
funkcja musi mieć dostęp World.player.invetory
i World.rooms
, describeMonster
musi mieć dostęp World.monsters
i tak dalej (w zasadzie, to musiprzekazać cały ładunek). Wydaje mi się, że to naprawdę wymaga globalnej zmiennej, nawet jeśli jest to dobry styl programowania, szczególnie w FP.
Jak rozwiązałbyś ten problem?