FP和OO正交?


13

我一次又一次听到,我试图理解和验证FP和OO是正交的。

首先,两个概念正交是什么意思?

FP尽可能地鼓励不变性和纯度。OO似乎是为状态和突变而构建的(命令式编程的稍微组织的版本?)。而且我确实意识到对象可以是不可变的。但是OO似乎意味着对我声明/更改。

他们似乎是相反的。这是否意味着它们是正交的?

像Scala这样的语言可以轻松实现OO和FP两者,这是否会影响这两种方法的正交性?


5
面向对象不需要对象操纵其状态。方法可以返回新对象作为结果。人们可以并且经常修改对象的状态这一事实并不意味着他们必须这样做,或者这是一个好主意。OO和FP不是对立的。
Huperniketes

4
在stackoverflow上重复:FP和OO正交?
sepp2k 2010年

Answers:


22

术语“正交”来自数学,它的同义词:“垂直”。在这种情况下,您可以将其理解为“两件事彼此无关”。

人们比较FP和OO时,经常会混淆两个单独的轴。

一方面,您具有功能编程与命令式编程。乔纳斯(Jonas)很好地比较了两者。单句版本表示“数据流与控制流”。

另一个轴是数据抽象。Haskell之类的语言使用抽象数据类型来抽象数据。Smalltalk使用对象,这些对象将数据和对该数据的操作融合到一个单元中。威廉·库克(William Cook)在他的《重新理解数据抽象》一书中解释得比我更好。

完全可以理解的是,大多数人最终认为FP和OO是相反的:大多数OO语言都是必须的,因此,如果比较Haskell和Java,则数据流+ ADT与控制流+对象是一致的。但是还有其他可能性!马蒂亚斯·费莱森(Matthias Felleisen)在他的“ 功能对象”中解释了如何快乐地将FP和OO结合在一起


+1,好答案。您的答案虽然错过了Haskell类型类。
missingfaktor

当然。我才刚刚开始真正地学习Haskell。
Frank Shearar

我想知道是否有任何有关那个功能对象演示的记录...我真的很感兴趣,但是仅凭幻灯片不能真正做到这一点。
宫坂丽

9

首先,两个概念正交是什么意思?

这意味着这两个概念没有相反的思想或彼此不兼容。

FP尽可能地鼓励不变性和纯度。OO似乎是为状态和突变而构建的(命令式编程的稍微组织的版本?)。而且我确实意识到对象可以是不可变的。但是OO似乎意味着对我声明/更改。

他们似乎是相反的。它如何影响它们的正交性?

像Scala这样的语言可以轻松实现OO和FP两者,这是否会影响这两种方法的正交性?

OO涉及封装,对象组成,数据抽象,通过子类型进行的多态性以及必要时的受控突变(OO中也鼓励不变性)。FP与功能组合,控件抽象和约束多态性(又称参数多态性)有关。因此,这两个想法并不矛盾。它们都为您提供了不同种类的功能和抽象机制,这在一种语言中肯定是可能的。实际上,这就是Scala构建的基础!

在Google的Scala实验演讲中,马丁·奥德斯基(Martin Odersky)很好地解释了他如何相信OO和FP这两个概念彼此正交,以及Scala如何将这两种范式优雅地,无缝地结合成一个新的范式,在Scala社区中广为人知。对象功能范式。必须看着你说话。:-)


对象功能语言的其他示例:OCamlF#Nemerle


1
“这意味着这两个概念没有相反的想法或彼此不兼容。” -是的,但是我想我会说“ 独特但不相容”之类的话。例如,如果一个是另一个的子集,那么它们将不会不兼容,但也不会是正交的。
Tim Goodman 2010年

@Tim:那是我[可能失败]定义该术语的尝试。你不是我的英文老师。:-|
missingfaktor

7

正交大致表示“独立”。

因此,如果FP和OO是正交的,则意味着无论是否使用对象,都可以使用不可变性,而无论对象是否不可变,都可以使用它们。


2
“独立”是一个很好的表达方式。并不是说它们是相反的,而是您的代码是函数式编程风格还是面向对象的编程风格是两回事。可以将它们像图表中的x轴和y轴一样思考-您可以上下移动一个,而固定在另一个上。(从数学意义上来说,x方向上的向量和y方向上的向量实际上是正交的-CS定义是相关的。)
Tim Goodman 2010年

@TimGoodman:我真的很喜欢您做的图类比中的x,y轴。当一个方向朝着另一个方向移动(我的意思是说,最终两个编程范例的目标都是拥有更简单且可维护的代码,不是吗?)
rahulaga_dev

0

* 我一次又一次听到,我试图理解和验证FP和OO是正交的。*

首先,两个概念正交是什么意思?

维基百科引用:“正交性保证修改由系统组件产生的技术效果既不会产生副作用,也不会将副作用传播到系统的其他组件。”

简单来说,这仅意味着对一个系统的更改不会,也不会影响另一系统的更改。

例如,一辆汽车具有正交的组件和控件(例如,对汽车进行加速不会影响到任何东西,除了与加速功能相关的组件之外。它不会影响收音机等(尽管我不确定它是否会影响CD的播放,因为我的确有时会跳过))。

FP尽可能地鼓励不变性和纯度。OO似乎是为状态和突变而构建的(命令式编程的稍微组织的版本?)。而且我确实意识到对象可以是不可变的。但是OO似乎意味着对我声明/更改。

他们似乎是相反的。这是否意味着它们是正交的?

金田 问题在于这些概念中没有一个是很难定义的。但是,是的,您已掌握了要点。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.