我想知道无状态编程的好处,发现有人分享了我的问题:无状态编程的优点?
当我阅读答案时,我对相反的问题感到好奇。有状态编程的优点是什么?似乎最近有很多人关注无状态代码,但我对趋势持谨慎态度。
似乎有状态(即命令式)编程可能比无状态(即函数式)编程更适合某些场景,我希望能够更好地识别哪些问题可以通过有状态编程来解决。
与不可变的无状态编程模型相比,基于可变的共享状态的编程模型在少数情况下具有无可争议的优势。可变性可以带来巨大优势的一个领域是允许算法就地工作。haskellwiki有一个关于实现快速排序的好例子:http://www.haskell.org/haskellwiki/Introduction#When_C_is_better
总结一下,当你不允许修改list内存时,你需要创建它的一个排序副本。对于修改某些数据结构的几乎任何其他算法也是如此,例如AVL树。
一般来说,函数式编程语言往往比命令式编程语言占用更多内存。现在内存很便宜,但是带宽是至关重要的,内存速度并没有随着CPU能力的提高而增加。然而,必须指出的是,Haskell的执行模型允许编译器执行一些漂亮的优化,包括内存使用和访问模式。在某种程度上,这可以弥补理论上的不足。
清晰是关键。我喜欢函数式编程(目前我正沉迷于clojure),但是状态才是世界运行的方式。面向对象范式比函数式编程或任何其他类型的编程更受欢迎,这并非偶然。面向对象和过程编程是新程序员阻力最小的途径。大多数人直观地理解对象是改变状态的东西(它可以移动,或者改变颜色,等等),而不是帮助递归的y组合子。
状态很重要。这个宇宙中的每个比特都有状态,状态定义了系统的行为方式,状态使系统动态和可用,但由于状态如此重要,如何访问和操纵状态也很重要。如果任何人都可以操纵他人的状态(状态是人类大脑中的内容),那将是不好的。我对状态的看法是,它应该是明确的,不应该分散在你的代码中,变得非常隐式,以至于很难知道系统处于什么状态,以及系统的哪一部分负责哪一部分的状态。状态的控制方式应该是这样的:你可以很容易地说,系统状态的这一部分是由这个模块处理的,而且只由这个模块处理。
在任何真实的FP程序中,它总是有两部分,一部分是无状态的,这将是你的核心算法等,其他部分将保持程序的状态。