【发布时间】:2011-11-16 06:15:09
【问题描述】:
如今,越来越多的注意力转向函数式编程的主要原因之一是多线程/处理的兴起,以及 FP 专注于无副作用、无状态计算的优势,从而使可扩展性变得轻松。
当然,尽管如此,在面向对象编程中,我们也可以转向无状态范式,在这种范式中,所有对象都不会改变状态。这可以是一种约定,甚至可能是语言隐式支持的。例如,在强制对象字段和方法之间统一访问的语言中,简单地不允许 setter 方法就可以实现这一点。
那么,我的问题是,既然 OO 可以利用无状态性,而对象没有任何要求有状态性,那么 OOP 是否实际上是 FP 的超集? FP 是否有任何其他优势/特性使多线程比 OOP 更实用?
【问题讨论】:
-
我希望那些无理由投票关闭的人被收取 5000 名声望。绝对是我最不喜欢的组。
-
这种 OO 只是 FP 的一个非常有限的子集(假设不满足其他 FP 要求,例如一流的函数和闭包)。您希望从这样的 OOP 中获得什么样的消息语义?不修改对象状态的消息是纯函数。然后类将成为模块。
-
当然,在这一点上,我不认为一流的函数和闭包是一个严格的函数特性(尽管这是它们开始的地方)。许多面向对象的语言可以通过块或类似机制支持闭包。我也在谈论禁用可变性,而不是实例化。可以遵循函数式编程中使用的相同模式,其中通过动态创建新对象及其组合对象来组合不可变原语来模拟修改状态。
-
@SK-logic 关于方法成为函数的假设是完全错误的——它们仍然可以访问类中的最终数据并且仍然表现出封装和继承。这实际上是 OO 编程的最佳方式。
-
@Bill K,他们能读到什么并不重要——只要他们不能修改状态,它们就是纯函数。而且,适当的模块提供了比典型 OOP 更好的封装——例如,查看 SML 第一类模块。
标签: oop functional-programming scalability stateless