在函数式编程中如何处理对状态的无效操作

时间:2019-04-13 19:17:30

标签: javascript functional-programming game-development

我目前正在研究俄罗斯方块游戏的功能编程风格实现。每次滴答或用户输入均使用函数传递给我,这些函数会传递游戏状态(带有指向当前活动块所在位置的指针的网格),然后该函数会返回新状态。

如果用户向左按下,但是当前活动块已经在最左侧,我该怎么办?我想让外部代码块知道它无法创建新状态,但是哪种模式似乎最好?我有几种样式,我倾向于以抛出错误的方式捕捉并发现错误,因为我认为它是最好的阅读和表达意图。

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;
}

1 个答案:

答案 0 :(得分:0)

我知道游戏有很多状态,并且大多数游戏开发者资源都严重依赖oop,但是状态在这里的多个地方都发生了变化。这减轻了fp的优势,并导致类似这样的混乱情况。

如果您对fp模式感兴趣,请考虑将状态变化描述为数据,并将其传递给实际上会引起突变的某种效果。

当多行代码处于突变状态,并且您使用类中的方法进行实际的突变时,您实际上正在执行。处理非法球员的举动是错误的,对我而言没有意义。您为什么要设计一个允许用户抛出错误的程序?如果您只是抓住它们而做其他事情,那为什么不创建自己的容器来处理它们呢?