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



我目前正在研究游戏俄罗斯方块的函数式编程风格实现。每个即时报价或用户输入都使用函数处理,其中我传入游戏状态(带有指向当前活动块所在位置的指针的网格(,该函数返回新状态。

如果用户按左键,但当前活动块已经向左边,我该怎么办?我想让外部代码块知道它无法创建新状态,但哪种模式看起来最好?我有几种风格,倾向于投掷并抓住错误,因为我觉得它最能阅读和表达意图。

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。将非法玩家动作作为错误处理对我来说没有意义。为什么要设计一个允许用户抛出错误的程序?如果您只是抓住它们并做其他事情,那么为什么不创建自己的容器来处理它们呢?

相关内容

  • 没有找到相关文章

最新更新