35

最近、関数型プログラミングへの注目が高まっている主な理由の1つは、マルチスレッド/処理の台頭と、スケーラビリティを簡単にするための副作用のないステートレス計算にFPが焦点を当てていることの利点です。

ただし、確かに、オブジェクト指向プログラミングでは、すべてのオブジェクトが状態を変化させることのないステートレスパラダイムに移行することもできます。これは慣例である場合もあれば、言語によって暗黙的にサポートされている場合もあります。たとえば、オブジェクトフィールドとメソッド間の均一なアクセスを強制する言語では、セッターメソッドを許可しないだけでこれを実現できます。

私の質問は、オブジェクト指向はステートレスを利用でき、オブジェクトについてはステートフル性を要求しないので、OOPは事実上FPのスーパーセットですか?マルチスレッドをOOPよりも実用的にするFPの追加の利点/機能はありますか?

4

3 に答える 3

17

それは程度の問題です。

関数型プログラミングに関数型言語を使用する利点は、飴と鞭です。ニンジンは、関数型言語には関数型の構文とセマンティクスがあり、関数型ライブラリが付属しているということです。スティックは、関数型言語が特定の標準に準拠することを強制できるということです。FP以外の言語でFPを実行すると、どちらも得られません。あなたは必然的に州に優しい標準ライブラリと戦うことになり、州を作らないように自分自身を取り締まらなければなりません。

CでOOを実行することとの類似性は良いものです。Cが正しい選択であり、OO構造も正しい選択であるような制約がある場合があります。GTKはその良い例です。OOPなしでUIツールキットを作成するのは非常に困難です。ただし、これは、通常はコンパイラーによって実行される作業を引き受けていることを意味します。ある言語では簡単なことの中には、構文的および意味的なサポートがない言語では困難または不可能になるものがあります。たとえば、多重継承をエミュレートするCプロジェクトを見たことがありません。手作業が多すぎます。

並列処理のためにOOコードに機能的なスタイルを採用した場合、多くの苦痛を伴わずに、求めているメリットを実現できる可能性は十分にあります。ただし、コードが純粋で、言語内でFPをサポートしていること、およびFPコンパイラーが最近実行できる優れた最適化についてのコンパイル時の保証を見逃すことになります。これはトレードオフであるため、これはケースバイケースで行う必要のある決定であり、あなただけが行うことができる決定です。

OOPがFPのスーパーセットであるかどうかについては、その概念に意味があるとは思いません。プログラムを表現するという点では、どちらも完全に機能します。FP言語でオブジェクト指向言語を実装できます。その逆も可能です。一方が問題のドメインに近い場合もあれば、もう一方が問題のあるドメインに近い場合もあります。とにかく、あなたの本当の質問は、FPが好きでなければならないかどうかだと思います。その答えは、いいえです。好きなものを使ってください。

Actorモデルもチェックすることを検討する必要があると思います。これは、より適切にOOであり、状態に依存しない(共有された状態に依存しない)だけでなく、スケーラビリティ/並列処理の利点も得られるためです。

于 2011-09-13T16:28:29.767 に答える
1

私はある時点でこれと同じ理解を持っていて、「修正」されました。関数型の人間ではないのですが、関数型言語には、そのスタイルのプログラミングによりよく適応するツールがいくつかあるようです。

Cのメソッドを構造体に組み合わせて置き換えることができるので、CをOOのスーパーセットにしないと言っているのは、Cプログラマーのようなものだと思います。実際、これはC ++が最初に実装された方法ですが、Cをオブジェクト指向言語にするわけではありません。

于 2011-09-13T15:27:02.837 に答える
-1

FPは、使用する言語ではなく、問題を解決する方法に重点を置いています。したがって、どのOOPもFPのスーパーセットではありません。FPの一部の構成(mapReduce、...)は、暗黙的にマルチスレッドアプリケーションに変換できます。しかし、OOPでそれらを使用することを妨げるものは何もありません。それはすべて考え方です。

于 2011-09-15T14:49:53.997 に答える