无状态面向对象编程与功能编程?

现在越来越多的关注功能编程的主要原因之一是多线程/处理的兴起以及FP侧重无副作用,无状态计算的优势,使得可伸缩性变得毫不费力。

当然,在面向对象编程中,我们也可以转向无状态范例,所有对象都不会变为变异状态。 这可以是一个惯例,或者甚至可以隐含地由语言支持。 例如,在执行对象字段和方法之间的统一访问的语言中,不允许使用setter方法就可以实现这一点。

那么我的问题是,由于面向对象可以利用无状态并且没有任何关于对象强制执行状态的事情,所以面向对象有效地是FP的超集? FP的其他优点/特性使多线程比OOP更实用吗?


这是一个学位问题。

使用函数式语言进行函数式编程的优点是胡萝卜和棒。 胡萝卜是功能语言具有功能语法和语义,并带有功能库。 棒是功能语言可以迫使你坚持某些标准。 如果您使用非FP语言进行FP,则不会得到这些FP。 你必然要与一个国家友好的标准图书馆作斗争,并且必须警惕自己,以确保你不创造国家。

在C中做OO的比喻是一个很好的例子。 有时你的约束条件是C是正确的选择,OO结构也是正确的选择。 GTK就是一个很好的例子。 在没有OOP的情况下编写UI工具箱非常困难。 但是,这意味着您正在进行通常由编译器完成的工作。 没有语法和语义支持的语言在一种语言中很容易变得困难或不可能。 例如,我从来没有见过仿效多重继承的C项目。 这只是手工劳动。

如果您为了并行性而在OO代码中采用功能性风格,那么很有可能您在获得好处之后没有太多的痛苦。 但是你仍然会错过编译时保证你的代码是纯粹的,对FP的语言内支持以及FP编译器当前能够实现的令人印象深刻的优化。 这是一个折衷,所以这是一个必须在个案基础上作出的决定,而且只有你可以做出。

至于OOP是否是FP的超集,我甚至不认为这个概念是有意义的。 在表达节目方面,他们都完全有能力。 您可以在FP语言中实现OO语言,反之亦然。 有时候更接近问题领域,有时更接近问题领域。 无论如何,我认为你真正的问题是一个人是否必须喜欢FP,而答案是否定的; 使用你喜欢的。

我认为你还应该考虑检查Actor模型,因为它更适合OO,而不是状态不友好(只是共享状态不友好),同时仍然具有可伸缩性/并行性的好处。


我曾经有过同样的理解,并且被“纠正”了。 不是一个功能性的人我不明白它,但显然有一些功能语言的工具可以更好地适应这种编程风格。

我认为这就像一个C程序员说的那样,因为C方法可以结合到一个结构体中并被替换,这不会使C成为面向对象的超集吗? 实际上,这就是C ++最初如何实现的,但它并不使C成为OO语言。


与您使用的语言相比,FP更多的是解决问题的方式。 所以没有OOP不是FP的超集。 FP(mapReduce,...)中的一些构造可以隐式转换为多线程应用程序。 但是没有什么能够阻止你在OOP中使用它们。 这都是关于心态。

链接地址: http://www.djcxy.com/p/80809.html

上一篇: Stateless Object Oriented Programming vs. Functional Programming?

下一篇: How to parse this grammar in Parsec? (unusual case of left recursion)