関数型プログラミングとオブジェクト指向プログラミング [closed] 質問する

関数型プログラミングとオブジェクト指向プログラミング [closed] 質問する

これまでは主に OO プログラミングに触れてきましたが、関数型言語を学ぶことを楽しみにしています。質問は次のとおりです。

  • オブジェクト指向プログラミングよりも関数型プログラミングを選択するのはどのようなときですか?
  • 関数型プログラミングがより適した選択肢となる典型的な問題定義は何ですか?

ベストアンサー1

オブジェクト指向よりも関数型プログラミングを選択するのはどのようなときですか?

異なる種類のソフトウェアの進化を予測する場合:

  • オブジェクト指向言語は、物事に対する一連の操作が固定されており、コードが進化するにつれて主に新しいものを追加する場合に適しています。これは、既存のメソッドを実装する新しいクラスを追加することで実現でき、既存のクラスはそのまま残ります。

  • 関数型言語は、物事の集合が固定されていて、コードが進化するにつれて、主に既存の物事に新しい操作を追加する場合に適しています。これは、既存のデータ型で計算する新しい関数を追加することで実現でき、既存の関数はそのまま残ります。

進化が間違った方向に進むと、次のような問題が発生します。

  • オブジェクト指向プログラムに新しい操作を追加するには、新しいメソッドを追加するために多くのクラス定義を編集する必要がある場合があります。

  • 関数型プログラムに新しい種類のものを追加するには、新しいケースを追加するために多くの関数定義を編集する必要がある場合があります。

この問題は長年よく知られており、1998年にはフィル・ワドラーはこれを「表現の問題」と名付けた。一部の研究者は、表現の問題はミックスインなどの言語機能で解決できると考えていますが、広く受け入れられる解決策はまだ主流になっていません。

関数型プログラミングがより適した選択肢となる典型的な問題定義は何ですか?

関数型言語は、ツリー形式の記号データを操作するのに優れています。 よく使われる例はコンパイラです。コンパイラでは、ソース言語と中間言語はほとんど変更されません (ほとんど同じもの)が、コンパイラの作成者は常に新しい翻訳とコードの改善または最適化 (新しい操作) を追加しています。 コンパイルと翻訳は、一般的に関数型言語の「キラー アプリ」です。

おすすめ記事