我目前正在研究俄罗斯方块游戏的功能编程风格实现。每次滴答或用户输入均使用函数传递给我,这些函数会传递游戏状态(带有指向当前活动块所在位置的指针的网格),然后该函数会返回新状态。
如果用户向左按下,但是当前活动块已经在最左侧,我该怎么办?我想让外部代码块知道它无法创建新状态,但是哪种模式似乎最好?我有几种样式,我倾向于以抛出错误的方式捕捉并发现错误,因为我认为它是最好的阅读和表达意图。
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;
}
答案 0 :(得分:0)
我知道游戏有很多状态,并且大多数游戏开发者资源都严重依赖oop,但是状态在这里的多个地方都发生了变化。这减轻了fp的优势,并导致类似这样的混乱情况。
如果您对fp模式感兴趣,请考虑将状态变化描述为数据,并将其传递给实际上会引起突变的某种效果。
当多行代码处于突变状态,并且您使用类中的方法进行实际的突变时,您实际上正在执行。处理非法球员的举动是错误的,对我而言没有意义。您为什么要设计一个允许用户抛出错误的程序?如果您只是抓住它们而做其他事情,那为什么不创建自己的容器来处理它们呢?