当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《高度可变域中的不可变功能对象》经验,为你挑选了2个好方法。

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

在做像Haar小波变换这样的事情时,我可以看到具有不可变对象的优雅 - 即当数据本身由对象表示时不会改变.

但我看到一个博客,其中有人以小游戏为例证明了不变性.如果一个生物对象收到了伤害,它没有改变它的状态 - 它返回了一个新的生物对象,其中包含新的生命值和一个新的"aggro to X"标志.但是,如果我们设计像MMORPG这样的东西,魔兽世界说.战场上的一百名玩家......可能有成千上万的攻击和缓冲/减益效果以不同的方式影响他们.是否仍然可以使用完全不可变的对象来设计系统?对我来说,似乎每个'滴答'会有一大群新的实例.为了获得当前有效的对象实例,所有客户端都会不断地经历某种中心"游戏世界"对象,或者?

函数式编程是否适用于此,或者这是"最佳工作的最佳工具,可能在这里不可变"的情况?



1> Curt J. Samp..:

对我来说,似乎每个'滴答'会有一大群新的实例.

的确,情况确实如此.我有一个Haskell应用程序,它读取市场数据源(在6小时交易日期间,对于我们感兴趣的数据,大约有500万条消息)并保持各种事物的"当前状态",例如最近的出价和报价价格和数量,我们的模型适合市场等等.在分析模式下模拟该程序的运行与记录的饲料是相当可怕的,并观察它分配和GC接近288在运行的前500秒内存储器的TB(或接近我机器RAM大小的50,000倍).(如果没有分析,这个数字会相当高,因为分析不仅会降低应用程序的速度,而且还会强制它在一个核心上运行.)

但请记住,纯语言实现中的垃圾收集器针对此类行为进行了优化.我对我的应用程序的整体速度感到非常满意,并且我认为这是相当苛刻的,因为我们必须从市场Feed中每秒解析几百条消息,做一些相当广泛的计算来构建我们的模型,并使用它模型生成订单,以尽快进入交易所.



2> Dickon Reed..:

通常在函数式编程中,您将不具有C++样式构造函数.然后,尽管从概念上讲,您始终在创建对象,但这并不意味着编译器必须使代码分配新对象,因为它不会影响程序的行为.由于数据是不可变的,因此编译器可以看到您刚刚指定的值以及传递给函数的内容.

然后,编译器可以创建非常紧凑的编译代码,只需在需要时计算特定对象中的字段.它的工作原理取决于您使用的编译器的质量.但是,干净的函数编程代码告诉编译器关于代码的信息比类似程序的C编译器所能承担的要多得多,因此一个好的编译器可能会产生比你预期的更好的代码.

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

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有