如何将JavaScript OOP转换为函数式

How to transform JavaScript OOP into functional

本文关键字:函数 转换 OOP JavaScript      更新时间:2023-09-26

我很好奇我的游戏在函数式风格而不是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?
}

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

它可能看起来像这样:

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 的《为什么函数式编程很重要》,至少读了两遍。