Functional programming 高度可变域中的不可变功能对象

Functional programming 高度可变域中的不可变功能对象,functional-programming,immutability,Functional Programming,Immutability,我目前正在利用业余时间学习Scala的函数式编程,我有一个空闲的新手问题 我可以看到,在进行诸如计算Haar小波变换之类的工作时,拥有不可变对象的优雅之处,即当对象所表示的数据本身不变时 但我看到一个博客,其中有人以一个小游戏为例演示了不变性。若一个生物对象受到伤害,它并没有改变它的状态——它返回一个新的生物对象,并带有新的生命值和新的“向X攻击”标志。但是魔兽世界说,如果我们要设计类似MMORPG的东西。战场上有一百名球员。。。可能会有数千次攻击和加减速/减减速法术效果以不同的方式影响他们。仍

我目前正在利用业余时间学习Scala的函数式编程,我有一个空闲的新手问题

我可以看到,在进行诸如计算Haar小波变换之类的工作时,拥有不可变对象的优雅之处,即当对象所表示的数据本身不变时

但我看到一个博客,其中有人以一个小游戏为例演示了不变性。若一个生物对象受到伤害,它并没有改变它的状态——它返回一个新的生物对象,并带有新的生命值和新的“向X攻击”标志。但是魔兽世界说,如果我们要设计类似MMORPG的东西。战场上有一百名球员。。。可能会有数千次攻击和加减速/减减速法术效果以不同的方式影响他们。仍然可以用完全不变的对象设计系统吗?在我看来,每一个“滴答声”都会出现大量新实例。要获得当前有效的对象实例,所有客户端都必须不断地通过某种中心“游戏世界”对象,或者


函数式编程是否为此而扩展,或者这是“最佳工作的最佳工具,在这里可能不是不变的”

与编程中的几乎所有工具一样,不变对象是强大的,但在错误的情况下是危险的。我认为这个游戏的例子不是很好,或者至少不是很做作

Eric Lippert对不变性有一些有趣的话题,这是一本非常有趣的书。

MMORPG已经是不变性的一个例子。由于游戏分布在服务器和玩家的系统中,因此绝对没有一个中心的“游戏世界”对象。因此,任何通过网络发送的对象都是不可变的,因为它不会被接收者改变。相反,一个新的对象或消息将作为响应发送(如果有)

我从来没有写过分布式游戏,所以我不知道它们是如何实现的,但我怀疑对对象的更新要么是本地计算的,要么是作为差异通过网络发送的

例如,您正在玩命令与征服。你的猛犸坦克正处于准备就绪状态,守卫着你的基地。你的对手用轻型坦克接近你的基地。你的猛犸坦克射击并击中对手的坦克,造成伤害

这个游戏非常简单,所以我怀疑只要有可能,很多都是在本地计算的。假设两个玩家的电脑在游戏状态方面最初是同步的。然后你的对手点击移动他的轻型坦克进入你的基地。一条消息(不可变)通过电线发送给您。由于移动坦克的算法(可能)是确定性的,你的命令与征服副本可以在你的屏幕上移动对手的坦克,更新你的游戏状态(可能是不变的或可变的)。当轻型坦克进入你的猛犸坦克射程时,你的坦克开火。服务器上会生成一个随机值(在这种情况下,任意选择一台计算机作为服务器),以确定射击是否击中对手。假设坦克被击中并且必须更新你对手的坦克,只有差异——坦克的新装甲等级降低到22%——通过电线发送,以同步两名玩家的游戏。此消息是不可变的


玩家电脑上代表坦克的对象是可变的还是不可变的都无关紧要;这两种方法都可以实现。每个玩家不会直接改变其他玩家的游戏状态。

关于不变性,需要注意的一点是(如果实现正确),它使对象创建相对轻量级。如果一个字段是不可变的,那么它可以在实例之间共享。

在设计一个功能性程序时很重要,像你的状态一样,不可变的对象会有一些开销。记住,MMORPG程序中的对象是不可变的,这一点也很重要,因为它本身就具有更高的可伸缩性。因此,设备的初始投资可能会更高,但随着事情的发展,你将能够扩展到你的玩家基础

另一个重要的问题是,现在最漂亮的机器每CPU有6个内核。考虑一个具有6个内核的双CPU机器。这12个核心中的一个可以进行垃圾收集,因此应用程序可以轻松地扩展到其他11个核心,从而可以抵消分解大量对象的开销


还要记住,并非每个对象(及其子对象)都需要在副本上完全重建。“复制”对象时,任何未更改的引用类型将只接受一个引用赋值 然后,编译器可以创建非常紧凑的编译代码,在需要时只计算特定对象中的字段。这项工作的好坏取决于您使用的编译器的质量。然而,干净的函数式编程代码告诉编译器的关于代码的信息要比C编译器对类似程序的假设多得多,因此一个好的编译器可能会生成比预期更好的代码


所以,至少在理论上,没有理由担心;函数式编程实现的可伸缩性与面向对象的堆分配实现一样好。实际上,您需要了解正在使用的语言实现的质量。

不要考虑在连线级别创建对象。例如,函数式语言w的优化运行时