如何将JavaScript OOP转换为功能

时间:2012-06-20 09:29:17

标签: javascript oop node.js functional-programming

我很好奇我的游戏在功能风格上的样子而不是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?
}

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

1 个答案:

答案 0 :(得分: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,至少两次。