Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在函数式编程中处理状态上的无效操作_Javascript_Functional Programming_Game Development - Fatal编程技术网

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

Javascript 如何在函数式编程中处理状态上的无效操作,javascript,functional-programming,game-development,Javascript,Functional Programming,Game Development,我目前正在开发一款功能性编程风格的俄罗斯方块游戏。每个勾号或用户输入都使用我在游戏状态中传递的函数(带有指向当前活动块所在位置的指针的网格)进行处理,该函数返回一个新状态 如果用户按左键,但当前活动块已位于最左侧,我该怎么办?我想让外部代码块知道它无法创建新状态,但是什么模式看起来最好?我有两种风格,我倾向于直接抛出并抓住错误,因为我觉得它最能表达我的意图 onLeft() { // try catch style try { this.state = moveLeft(this

我目前正在开发一款功能性编程风格的俄罗斯方块游戏。每个勾号或用户输入都使用我在游戏状态中传递的函数(带有指向当前活动块所在位置的指针的网格)进行处理,该函数返回一个新状态

如果用户按左键,但当前活动块已位于最左侧,我该怎么办?我想让外部代码块知道它无法创建新状态,但是什么模式看起来最好?我有两种风格,我倾向于直接抛出并抓住错误,因为我觉得它最能表达我的意图

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。在我看来,以错误的方式处理玩家的非法移动毫无意义。为什么要设计一个允许用户抛出错误的程序?如果您只是捕获它们并执行其他操作,那么为什么不创建自己的容器来处理它们呢?

您是否看到在这种情况下需要执行的任何操作?在实际用例中,我没有看到任何。在这种情况下,
moveLeft
操作将返回相同的状态,无需执行其他操作。这也不例外:当块已经位于其最左侧位置时,允许用户按left。这只是块不再移动的行为的一部分。@trincot没错,但我可能想触发一个动画。不过,还有其他重要的动作:例如,当我在网格上放置一个新块时,但由于网格上没有位置,这是不可能的,这意味着游戏结束了。因此,错误场景会随着游戏的进行而被捕获。我个人会为意外错误保留引发错误,而不是游戏规则中的错误。但是在这一点上可能会有不同的看法。确切地说,尽管我觉得try/catch感觉很到位,但我知道它通常用于不应该发生的错误流。但我不喜欢其他选择。