首页 > 解决方案 > 如何在函数式编程中处理对状态的无效操作

问题描述

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

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

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

标签: javascriptfunctional-programminggame-development

解决方案


我知道游戏有很多状态,并且大多数游戏开发资源都严重依赖 oop,但状态在这里的多个地方正在发生变异。这减轻了 fp 的优势,并导致像这样令人困惑的情况。

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

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


推荐阅读