이것은 주로 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에서 특히 좋은 프로그래밍 스타일이지만 글로벌 변수를 요구하는 것 같습니다.
이 문제를 어떻게 해결 하시겠습니까?