FPとOOは直交ですか?


13

私は何度も何度も耳にしましたが、FPとOOは直交しているという考えを理解し、検証しようとしています。

まず、2つの概念が直交しているとはどういう意味ですか?

FPは、可能な限り不変性と純度を推奨します。そしてオブジェクト指向は、状態と突然変異(命令型プログラミングのわずかに組織化されたバージョン?)のために構築されたもののようです。そして、私はオブジェクトが不変であることを理解しています。しかし、オブジェクト指向は私に状態/変化を暗示しているようです。

彼らは反対のように見えます。それは、それらが直交しているということですか?

Scalaのような言語を使用すると、OOとFPの両方を簡単に実行できますが、これは2つのメソッドの直交性に影響しますか?


5
オブジェクト指向では、オブジェクトの状態を操作する必要はありません。メソッドは結果として新しいオブジェクトを返すことができます。オブジェクトの状態を変更できる、そして実際に変更するという事実は、オブジェクトを変更する必要がある、またはそれが良い考えであることを意味しません。OOとFPは反対ではありません。
Huperniketes

4
stackoverflowでの重複:FPとOO直交?
sepp2k

回答:


22

「直交」という用語は数学に由来し、同義語は「垂直」です。この文脈では、「2つのことは互いに関係がない」と理解できます。

FPとOOを比較するとき、多くの場合、2つの別々の軸を混同します。

一方では、関数型プログラミングと命令型プログラミングがあります。ジョナスはこの2つをよく比較しています。一文バージョンでは、「データフロー対制御フロー」と書かれています。

もう1つの軸はデータの抽象化です。Haskellなどの言語は、抽象データ型を使用して、抽象データを作成します。Smalltalkはオブジェクトを使用します。オブジェクトは、データとそのデータに対する操作を単一のユニットに融合します。ウィリアムクックは、「データ抽象化の理解について」の論文で、私が説明できるよりも良い説明をしています。

ほとんどの人がFPとOOは正反対だと考えることは完全に理解できます。ほとんどのOO言語は必須です。たとえば、HaskellとJavaを比較すると、データフロー+ ADTと制御フロー+オブジェクトがあります。しかし、他の可能性もあります!Matthias Felleisenは、彼の講演Functional ObjectsでFPとOOを幸せに結婚させる方法を説明しています。


+1、素晴らしい答え。あなたの答えは、Haskell型クラスでは見逃しています。
missingfaktor

確かに。私は実際にHaskellの学習を始めたばかりです。
フランクシェラー

そのFunctional Objectsプレゼンテーションの録画があるかどうか疑問に思います...私は本当に興味がありますが、スライドだけではそれを正しく行いません。
宮坂

9

まず、2つの概念が直交しているとはどういう意味ですか?

これは、2つの概念に対照的なアイデアがないか、互いに矛盾しないことを意味します。

FPは、可能な限り不変性と純度を推奨します。そしてオブジェクト指向は、状態と突然変異(命令型プログラミングのわずかに組織化されたバージョン?)のために構築されたもののようです。そして、私はオブジェクトが不変であることを理解しています。しかし、オブジェクト指向は私に状態/変化を暗示しているようです。

彼らは反対のように見えます。直交性にどのように影響しますか?

Scalaのような言語を使用すると、OOとFPの両方を簡単に実行できますが、これは2つのメソッドの直交性に影響しますか?

OOは、カプセル化、オブジェクト構成、データ抽象化、サブタイピングによるポリモーフィズム、および必要な場合の制御された突然変異に関するものです(OOでも不変性が推奨されます)。FPは、関数の構成、制御の抽象化、および制約付き多型(別名パラメトリック多型)についてです。したがって、2つのアイデアは矛盾していません。どちらも異なる種類の力と抽象化メカニズムを提供します。これらは確かに1つの言語で使用できます。実際、これはScalaが構築された論文です!

彼にはScalaの実験 OOとFP - - Googleの話、マーティン・オーダーズキーは非常によく、彼は二つの概念を信じてどのようにそれを説明して互いに直交するとScalaは一般にようScalaのコミュニティで知られている新しいパラダイムの中にエレガントかつシームレスに2つのパラダイムを統合する方法オブジェクト機能パラダイム。あなたの話を見てください。:-)


オブジェクト関数言語の他の例:OCamlF#Nemerle


1
「これは、2つの概念に対照的なアイデアがないか、互いに矛盾しないことを意味します。」-それは本当ですが、私は「明確だが互換性がない」というようなことを言うと思います。たとえば、一方が他方のサブセットである場合、互換性はありませんが、直交することもありません。
ティムグッドマン

@ティム:それは用語を定義する私の(多分失敗した)試みでした。私はあなたが見る英語の第一人者ではありません。:-|
missingfaktor

7

直交とは、おおよそ「独立」を意味します。

したがって、FPとOOが直交している場合、オブジェクトを使用するかどうかに関係なく不変性を使用でき、不変であるかどうかに関係なくオブジェクトを使用できます。


2
「独立」はそれを置く良い方法です。それらが反対だというわけではありませんが、コードが関数型プログラミングスタイルであるかオブジェクト指向プログラミングスタイルであるかは、2つの別個のものです。それらをグラフのx軸とy軸のように考えてください。一方を上下に動かし、もう一方を固定したままにすることができます。(数学的な意味では、x方向のベクトルとy方向のベクトルは文字通り直交しています。CS定義は関連しています。)
ティムグッドマン

@TimGoodman:あなたが作ったグラフのアナロジーのx、y軸が本当に好きでした。これは、ある方向と別の方向に移動するときに達成される最終結果にマッピングできますか(最終的には、両方のプログラミングパラダイムの目標は、より簡単で保守可能なコードを持つことですよね?)
rahulaga_dev

0

* 私はこれまで何度も聞いてきましたが、FPとOOは直交しているという考えを理解し、検証しようとしています。*

まず、2つの概念が直交しているとはどういう意味ですか?

ウィキペディアの引用:「直交性は、システムのコンポーネントによって生成される技術的効果を変更することにより、システムの他のコンポーネントに副作用が発生または伝播しないことを保証します。」

簡単に言えば、1つのシステムへの変更が他のシステムの変更に影響を与えることはなく、影響を及ぼさないことを意味します。

たとえば、自動車には直交するコンポーネントとコントロールがあります(たとえば、車両を加速しても、加速機能にのみ関係するコンポーネント以外には影響しません。たとえば、ラジオには影響しません(CDの再生に影響するかどうかはわかりませんが、私は時々スキップするので))。

FPは、可能な限り不変性と純度を推奨します。そしてオブジェクト指向は、状態と突然変異(命令型プログラミングのわずかに組織化されたバージョン?)のために構築されたもののようです。そして、私はオブジェクトが不変であることを理解しています。しかし、オブジェクト指向は私に状態/変化を暗示しているようです。

彼らは反対のように見えます。それは、それらが直交しているということですか?

ちょっと。問題は、これらの概念のどれもが本当にハードに定義されていないことです。しかし、はい、あなたはそれの要点を得ました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.