【问题标题】:How to transform JavaScript OOP into functional如何将 JavaScript OOP 转换为函数式
【发布时间】:2012-06-20 09:29:17
【问题描述】:

我很好奇我的游戏在函数式而不是 OOP 中会是什么样子。

以下是 Node.js 中的核心代码行:

if (!player.owns(flag) && player.near(flag)  && flag.isUnlocked()) {
    player.capture(flag);
}

我的猜测是,它可能看起来像这样:

var canCapture = [not(owns), isNear, canUnlock].every(function(cond) {
    return cond(playerData, flagData);  
});

if(canCapture) {
    // how to capture?
}

但不确定,因为没有经验丰富的函数式编码器。我对与主题相关的每个答案都感兴趣(甚至可以是其他编程风格)。

【问题讨论】:

  • 我不确定 OOP 部分在您的代码中的什么位置?甚至你在这个术语下的理解。
  • 您拥有带有方法的 Player 类实例:“owns”、“near”、“capture”。您还有带有“isUnlocked”方法的 Flag 类实例。
  • 但这些对象仍会保留。所以它们不会从 OOP 转换为函数式......你的问题实际上是:我如何编写一个 All 谓词,我可以在其中提供一组函数/值,它应该返回 true什么时候都是true
  • 是的,对象将保留,而是作为通用数据容器({lat:33.33, lon:33.33, name:"Rob"})而不是专用类实例。功能风格是否拒绝使用对象?我只是好奇如何编写这样的游戏规则“如果玩家没有旗帜并且旗帜在他附近解锁,那么他会自动捕获这面旗帜。”在函数式编程中。这有意义吗?

标签: javascript oop node.js functional-programming


【解决方案1】:

它可能看起来像这样:

if (!player.owns(flag) && player.near(flag)  && flag.isUnlocked()) {
    capturingPlayer = player.capture(flag);
}

其中capturingPlayer 是一个 对象,它与player 的区别在于它捕获了一个标志。 player 未通过对 capture 的调用进行修改。

如果您更喜欢“非 OO”语法(无论这意味着什么)

if (!owns(player, flag) && near(player, flag)  && isUnlocked(flag)) {
    capturingPlayer = capture(player, flag);
}

扩展并希望澄清一下:

在函数式编程社区所采用的意义上,函数式编程仅仅意味着“函数/过程是一流的对象”。

的意思是函数是数学意义上的函数,即

  • 所有函数都返回一个值。
  • 每个函数每次传递相同的参数时都返回相同的值。
  • 函数没有任何副作用 - 没有可变对象或赋值。

因此,只要您的对象的任何方法都不会改变对象,您实际上不需要进行太多更改即可以“函数式风格”进行编程。


编辑:

不幸的是,“功能”和“面向对象”(尤其是)都是定义不明确的概念。
尝试找到“面向对象”的定义 - 定义的数量至少与尝试定义它的人一样多。
要了解函数式编程,请阅读 John Hughes 的 Why functional programming matters 至少两遍。

【讨论】:

  • 哦,感谢您的澄清!那么这是否意味着,函数式编程通常是仅限于不可变对象的 OO 编程(通常)?会不会是:if (!player.owns(flag) && player.near(flag) && flag.isUnlocked()) { player = player.capture(flag); }
  • @Kasztan:不,它没有。我的意思是语法不是必需的,可能使用点符号和不可变的“对象”以“功能样式”编写。不过,这并不常见。
猜你喜欢
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-04
  • 2021-08-01
  • 1970-01-01
  • 2021-08-14
相关资源
最近更新 更多