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