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

don*_*ain 30 oop functional-programming scalability stateless

如今,越来越多的注意力转向功能性编程的主要原因之一是多线程/处理的兴起以及FP专注于无副作用的无状态计算的优势,使得可扩展性毫不费力.

当然,在面向对象编程中,我们也可以转向无状态范例,其中所有对象永远不会变异状态.这可以是一种约定,或者甚至可能由语言隐式支持.例如,在对象字段和方法之间强制统一访问的语言中,简单地不允许setter方法就可以实现这一点.

那么,我的问题是,由于面向对象可以利用无状态而对于对象强制有状态,OOP是否有效地成为FP的超集?FP的任何其他优点/特性是否使多线程比OOP更实用?

Dan*_*ons 15

这是一个程度问题.

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

在C中做OO的类比是一个很好的.有时您的约束条件使得C是正确的选择,而OO结构也是正确的选择.GTK就是一个很好的例子.在没有OOP的情况下编写UI工具包非常困难.但是,这意味着您正在接受通常由编译器完成的工作.在没有语法和语义支持的语言中,一种语言中易于使用的一些东西变得困难或不可能.例如,我从未见过模拟多重继承的C项目.这只是太多的体力劳动.

如果你为了并行性而在你的面向对象代码中采用了一种功能风格,那么你很有可能在没有太多痛苦的情况下实现你所拥有的好处.但是你仍然会错过编译时保证你的代码是纯粹的,对FP的语言内支持以及FP编译器目前能够进行的令人印象深刻的优化.这是一个权衡,所以这是一个必须根据具体情况做出的决定,而且这是你唯一可以做出的决定.

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

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