我一次又一次听到,我试图理解和验证FP和OO是正交的。
首先,两个概念正交是什么意思?
FP尽可能地鼓励不变性和纯度。OO似乎是为状态和突变而构建的(命令式编程的稍微组织的版本?)。而且我确实意识到对象可以是不可变的。但是OO似乎意味着对我声明/更改。
他们似乎是相反的。这是否意味着它们是正交的?
像Scala这样的语言可以轻松实现OO和FP两者,这是否会影响这两种方法的正交性?
我一次又一次听到,我试图理解和验证FP和OO是正交的。
首先,两个概念正交是什么意思?
FP尽可能地鼓励不变性和纯度。OO似乎是为状态和突变而构建的(命令式编程的稍微组织的版本?)。而且我确实意识到对象可以是不可变的。但是OO似乎意味着对我声明/更改。
他们似乎是相反的。这是否意味着它们是正交的?
像Scala这样的语言可以轻松实现OO和FP两者,这是否会影响这两种方法的正交性?
Answers:
术语“正交”来自数学,它的同义词:“垂直”。在这种情况下,您可以将其理解为“两件事彼此无关”。
人们比较FP和OO时,经常会混淆两个单独的轴。
一方面,您具有功能编程与命令式编程。乔纳斯(Jonas)很好地比较了两者。单句版本表示“数据流与控制流”。
另一个轴是数据抽象。Haskell之类的语言使用抽象数据类型来抽象数据。Smalltalk使用对象,这些对象将数据和对该数据的操作融合到一个单元中。威廉·库克(William Cook)在他的《重新理解数据抽象》一书中解释得比我更好。
完全可以理解的是,大多数人最终认为FP和OO是相反的:大多数OO语言都是必须的,因此,如果比较Haskell和Java,则数据流+ ADT与控制流+对象是一致的。但是还有其他可能性!马蒂亚斯·费莱森(Matthias Felleisen)在他的“ 功能对象”中解释了如何快乐地将FP和OO结合在一起。
首先,两个概念正交是什么意思?
这意味着这两个概念没有相反的思想或彼此不兼容。
FP尽可能地鼓励不变性和纯度。OO似乎是为状态和突变而构建的(命令式编程的稍微组织的版本?)。而且我确实意识到对象可以是不可变的。但是OO似乎意味着对我声明/更改。
他们似乎是相反的。它如何影响它们的正交性?
像Scala这样的语言可以轻松实现OO和FP两者,这是否会影响这两种方法的正交性?
OO涉及封装,对象组成,数据抽象,通过子类型进行的多态性以及必要时的受控突变(OO中也鼓励不变性)。FP与功能组合,控件抽象和约束多态性(又称参数多态性)有关。因此,这两个想法并不矛盾。它们都为您提供了不同种类的功能和抽象机制,这在一种语言中肯定是可能的。实际上,这就是Scala构建的基础!
在Google的Scala实验演讲中,马丁·奥德斯基(Martin Odersky)很好地解释了他如何相信OO和FP这两个概念彼此正交,以及Scala如何将这两种范式优雅地,无缝地结合成一个新的范式,在Scala社区中广为人知。对象功能范式。必须看着你说话。:-)
正交大致表示“独立”。
因此,如果FP和OO是正交的,则意味着无论是否使用对象,都可以使用不可变性,而无论对象是否不可变,都可以使用它们。
* 我一次又一次听到,我试图理解和验证FP和OO是正交的。*
首先,两个概念正交是什么意思?
维基百科引用:“正交性保证修改由系统组件产生的技术效果既不会产生副作用,也不会将副作用传播到系统的其他组件。”
简单来说,这仅意味着对一个系统的更改不会,也不会影响另一系统的更改。
例如,一辆汽车具有正交的组件和控件(例如,对汽车进行加速不会影响到任何东西,除了与加速功能相关的组件之外。它不会影响收音机等(尽管我不确定它是否会影响CD的播放,因为我的确有时会跳过))。
FP尽可能地鼓励不变性和纯度。OO似乎是为状态和突变而构建的(命令式编程的稍微组织的版本?)。而且我确实意识到对象可以是不可变的。但是OO似乎意味着对我声明/更改。
他们似乎是相反的。这是否意味着它们是正交的?
金田 问题在于这些概念中没有一个是很难定义的。但是,是的,您已掌握了要点。