我目前正在研究游戏俄罗斯方块的函数式编程风格实现。每个即时报价或用户输入都使用函数处理,其中我传入游戏状态(带有指向当前活动块所在位置的指针的网格(,该函数返回新状态。
如果用户按左键,但当前活动块已经向左边,我该怎么办?我想让外部代码块知道它无法创建新状态,但哪种模式看起来最好?我有几种风格,倾向于投掷并抓住错误,因为我觉得它最能阅读和表达意图。
onLeft() {
// try catch style
try {
this.state = moveLeft(this.state);
} catch (err) {
// oh no!
}
// callback style
moveLeft(
(err) => {
// oh no!
},
(newState) => {
this.state = newState
}
);
// return false for invalid state
this.state = moveLeft(this.state) || this.state;
}
我知道游戏有很多状态,大多数游戏开发资源都严重依赖 oop,但状态在这里的多个地方都在发生变化。这减轻了 fp 的优势,并导致这样的混乱情况。
如果您对 fp 模式感兴趣,请考虑将状态变化描述为数据,并将其传递给实际发生突变的某种效果。
当多行代码处于变异状态时,并且您正在使用类中的方法来执行实际的更改,您实际上是在执行 oop。将非法玩家动作作为错误处理对我来说没有意义。为什么要设计一个允许用户抛出错误的程序?如果您只是抓住它们并做其他事情,那么为什么不创建自己的容器来处理它们呢?