8

我想知道无状态编程的好处,发现有人分享了我的问题: 无状态编程的优势?

不过,当我阅读答案时,这让我对相反的问题感到好奇。有状态编程的优点是什么?最近似乎有很多关注无状态代码,但我对趋势持谨慎态度。

似乎有状态(即命令式)编程可能比无状态(即函数式)编程更适合某些场景,我希望能够更好地识别哪些问题可以通过有状态编程来解决。

4

3 回答 3

6

只有少数情况下,与不可变、无状态的编程模型相比,基于可变、共享状态的编程模型具有无可争议的优势。可变性可以带来巨大优势的一个领域是允许算法就地工作。haskell wiki 有一个关于实现快速排序的好例子:http ://www.haskell.org/haskellwiki/Introduction#When_C_is_better

总而言之,当您不允许修改列表内存时,您需要创建它的排序副本。对于修改某些数据结构的几乎任何其他算法也是如此,例如 AVL 树。

一般来说,函数式编程语言往往比命令式语言更占用内存。现在内存很便宜,但带宽至关重要,而且内存速度的增加与我们看到的 CPU 能力的增加不成正比。然而必须注意的是,Haskell 的执行模型允许编译器执行一些漂亮的优化,包括内存使用和访问模式。这在一定程度上可以弥补理论上的不足。

于 2011-10-24T06:22:39.340 回答
1

易读性是关键。我喜欢函数式编程(目前我正热衷于 clojure 狂欢),但状态是世界的运作方式。面向对象范式比函数式或任何其他类型的编程更流行,这并非偶然。OOP 和过程式编程是新程序员阻力最小的途径。大多数人直观地将对象的概念理解为改变状态的东西(它可以移动,或改变颜色等),而不是有助于递归的 Y 组合器。

于 2011-10-24T06:24:13.717 回答
1

状态很重要。这个宇宙中的每一点都有状态,它是定义系统行为方式的状态,状态使系统动态和可用,但由于状态如此重要,如何访问和操作该状态也很重要。如果任何人都可以操纵其他人的状态(状态作为人脑中的内容),那将是不好的。我对状态的看法是,它应该是明确的,不应该是分散在你的代码中的东西,并且变得非常隐含很难知道系统处于什么状态以及系统的哪个部分负责哪个部分国家。状态应该以这样一种方式控制,你可以很容易地说系统的这部分状态是由这个模块处理的,并且只有这个模块。

在任何现实世界的 FP 程序中,它总是有 2 个部分,一个是无状态的,它是你的核心算法等,另一个部分将保持程序的状态。

于 2011-10-24T06:35:07.657 回答