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

时间:2011-09-13 14:50:28

标签: oop functional-programming scalability stateless

近来日益关注功能编程的主要原因之一是多线程/处理的兴起以及FP专注于无副作用,无状态计算的优势,使得可扩展性毫不费力。

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

那么,我的问题是,既然OO可以利用无状态而且没有任何关于对象要求有状态的东西,OOP是否有效地成为FP的超集? FP的任何其他优点/特性是否使多线程比OOP更实用?

3 个答案:

答案 0 :(得分:15)

这是一个学位问题。

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

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

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

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

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

答案 1 :(得分:1)

我在某一点上有同样的理解,并且是“更正”。不是一个功能性的人我没有得到它,但显然有一些功能语言的工具可以更好地适应这种编程风格。

我认为这就像一个C程序员说,因为C方法可以组合成一个结构而被替换不会使C成为OO的超集?实际上,这就是C ++最初实现的方式,但它并不能使C成为OO语言。

答案 2 :(得分:-1)

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