如何将JavaScript OOP转换为函数式
How to transform JavaScript OOP into functional
我很好奇我的游戏在函数式风格而不是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 的《为什么函数式编程很重要》,至少读了两遍。
相关文章:
- 如何在将Node异步函数转换为promise时使用Q库
- 如何分解jQuery"toggle”;函数转换为separate“;显示“;以及“;隐藏“;功能
- 将函数转换为jQuery插件
- jquery递归函数转换为非递归函数
- jQuery函数转换为MooTools
- 将javascript函数转换为jquery
- 将Window Onload函数转换为非阻塞
- 如何将下面的递归函数转换为纯函数
- 将jquery函数转换为js
- 如何将这个递归函数转换为迭代函数
- 将递归函数转换为异步 CPS 实现 (javascript)
- 通过在JavaScript中将函数转换为对象可以实现什么
- 从JavaScript函数转换为jQuery
- JS:将单参数函数转换为可链接函数
- 如何将此函数转换为 Angular 指令
- 从控制台中的工作函数转换为工作脚本.(请参阅编辑)
- 将图像的 onError 函数转换为返回函数
- jQuery:将每个函数转换为 for 循环
- 如何将 JavaScript forEach 循环/函数转换为 CoffeeScript
- Javascript 将声明为函数字典的函数转换为原型