Đây chủ yếu là một câu hỏi lý thuyết về FP, nhưng tôi sẽ thực hiện các cuộc phiêu lưu văn bản (như Zork trường học cũ) để minh họa quan điểm của tôi. Tôi muốn biết ý kiến của bạn về cách bạn mô hình hóa một mô phỏng trạng thái với FP.
Cuộc phiêu lưu văn bản dường như thực sự kêu gọi OOP. Ví dụ: tất cả các "phòng" là các thể hiện của một Roomlớp, bạn có thể có một Itemlớp cơ bản và các giao diện như Item<Pickable>đối với những thứ bạn có thể mang theo, v.v.
Mô hình thế giới trong FP hoạt động khác nhau, đặc biệt nếu bạn muốn thực thi tính bất biến trong một thế giới phải biến đổi khi trò chơi tiến triển (đối tượng bị di chuyển, kẻ thù bị đánh bại, điểm số tăng lên, người chơi thay đổi vị trí của nó). Tôi tưởng tượng một vật thể lớn duy nhất Worldcó tất cả: các phòng bạn có thể khám phá là gì, chúng được liên kết như thế nào, người chơi đang mang gì, đòn bẩy nào đã được kích hoạt.
Tôi nghĩ rằng một cách tiếp cận thuần túy sẽ là về cơ bản chuyển đối tượng lớn này đến bất kỳ chức năng nào và nó đã được họ trả lại (có thể đã được sửa đổi). Ví dụ, tôi có một moveToRoomchức năng nhận Worldvà trả lại nó với sự World.player.locationthay đổi sang phòng mới, World.rooms[new_room].visited = Truev.v.
Ngay cả khi đây là cách "chính xác" hơn, nó dường như đang thực thi sự thuần khiết vì lợi ích của nó. Tùy thuộc vào ngôn ngữ lập trình, việc truyền Worldđối tượng có khả năng rất lớn này qua lại có thể tốn kém. Ngoài ra, mọi chức năng có thể cần phải có quyền truy cập vào bất kỳ Worldđối tượng. Ví dụ, một căn phòng có thể có thể truy cập được hoặc không phụ thuộc vào đòn bẩy được kích hoạt ở phòng khác vì nó có thể bị ngập nước, nhưng nếu người chơi mang áo phao, dù sao thì nó cũng có thể vào được. Một con quái vật có thể hung dữ hay không tùy thuộc vào việc người chơi đã giết anh em họ của mình trong một căn phòng khác. Điều này có nghĩa là roomCanBeEnteredhàm cần truy cập World.player.invetoryvà World.rooms, describeMonstercần truy cập World.monsters, v.v. (về cơ bản, bạn phảivượt qua toàn bộ tải xung quanh). Điều này thực sự đối với tôi để gọi một biến toàn cục, ngay cả khi đây là tất cả nhưng phong cách lập trình tốt, đặc biệt là trong FP.
Làm thế nào bạn sẽ giải quyết vấn đề này?