Đâ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 Room
lớp, bạn có thể có một Item
lớ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 World
có 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 moveToRoom
chức năng nhận World
và trả lại nó với sự World.player.location
thay đổi sang phòng mới, World.rooms[new_room].visited = True
v.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à roomCanBeEntered
hàm cần truy cập World.player.invetory
và World.rooms
, describeMonster
cầ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?