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

首先,两个概念成为正交意味着什么?

FP尽可能地鼓励不变性和纯度。 OO似乎是为状态和突变而建立的(急切编程的略有组织版本?)。我确实意识到对象可能是不可变的。但是,OO似乎暗示了我的变化。

他们看起来像是对立面。这是否意味着它们是正交的?

像Scala这样的语言使同时使用OO和FP都可以轻松地进行OO和FP,这是否会影响两种方法的正交性?

有帮助吗?

解决方案

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

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

一方面,您具有功能性编程与命令编程。乔纳斯很好 比较 两者。一个句子版本说“数据流与控制流”。

另一个轴是数据抽象。诸如Haskell之类的语言使用抽象数据类型,井,抽象数据。 SmallTalk使用对象,将数据和该数据上的数据和操作融合到一个单元中。威廉·库克(William Cook)的解释比我的论文更好 了解数据抽象,重新审视.

完全可以理解的是,大多数人最终认为FP和OO是对立面的:大多数OO语言都是必要的,因此,如果您比较Haskell和Java,则具有数据流 + ADT与Control Flow +对象。但是还有其他可能性!马蒂亚斯·费利森(Matthias Felleisen)解释了如何在演讲中愉快地嫁给FP和OO 功能对象.

其他提示

首先,两个概念成为正交意味着什么?

这意味着这两个概念没有对比的想法,也没有彼此不兼容。

FP尽可能地鼓励不变性和纯度。 OO似乎是为状态和突变而建立的(急切编程的略有组织版本?)。我确实意识到对象可能是不可变的。但是,OO似乎暗示了我的变化。

他们看起来像是对立面。它如何影响他们的正交性?

像Scala这样的语言使同时使用OO和FP都可以轻松地进行OO和FP,这是否会影响两种方法的正交性?

OO是关于封装,对象组成,数据抽象,通过亚型的多态性以及 必要时受控突变 (在OO中也鼓励不变性)。 FP涉及功能组成,控制抽象和约束多态性(又称参数多态性)。因此,这两个想法并不矛盾。它们都为您提供不同种类的力量和抽象机制,这些机制当然可以使用一种语言。实际上,这是一个论文 Scala 被建!

在他的 Scala实验 马丁·奥德斯基(Martin Odersky)在Google上谈话很好地解释了他如何相信这两个概念-OO和FP - 彼此之间是正交的,Scala如何优雅地和无缝地将两个范式统一为Scala社区中普遍称为对象功能范式的新范式。必须看着你说话。 :-)


对象功能功能的其他示例: OCAML, F#, Nemerle.

正交 粗略表示“独立”。

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

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

首先,两个概念成为正交意味着什么?

Wikipedia Quote:“正交性确保修改系统组件所产生的技术效应既不会产生也不会传播到系统其他组件的副作用。”

简而言之,这只是意味着对一个系统的更改不会,也不会影响另一个系统的变化。

例如,汽车具有正交组件和控件(例如,加速车辆不会影响其他任何东西,而是仅涉及加速功能的组件。因为我有时会跳过)。

FP尽可能地鼓励不变性和纯度。 OO似乎是为状态和突变而建立的(急切编程的略有组织版本?)。我确实意识到对象可能是不可变的。但是,OO似乎暗示了我的变化。

他们看起来像是对立面。这是否意味着它们是正交的?

有点。问题在于,这些概念都不是真正的岩石定义。但是,是的,你有要点。

许可以下: CC-BY-SA归因
scroll top