1. ホーム
  2. oop

[解決済み] 関数型プログラミングとオブジェクト指向プログラミングの比較【終了しました

2022-03-18 06:15:40

質問

これまで主にOOプログラミングに触れてきたので、関数型言語を学びたいと思っています。質問は以下の通りです。

  • オブジェクト指向ではなく、関数型プログラミングを選択するのはどのような場合ですか?
  • 関数型プログラミングが有利な典型的な問題定義とは?

どのように解決するのか?

<ブロッククオート

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

異なる種類のソフトウェアの進化が予想される場合。

  • オブジェクト指向言語が得意とするのは、「オブジェクトの集合」が決まっている場合です。 操作 について もの そして、コードが進化するにつれて、主に新しいものを追加していきます。 これは、既存のメソッドを実装した新しいクラスを追加し、既存のクラスはそのままにすることで実現できます。

  • 関数型言語が得意とするのは、「関数型」「関数型」「関数型」「関数型」「関数型」「関数型」の固定セットです。 もの そして、コードが進化するにつれて、主に新しい 操作 を既存のものに適用します。これは、既存のデータ型を使って計算する新しい関数を追加し、既存の関数はそのままにしておくことで実現できます。

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

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

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

この問題は昔からよく知られており、1998年には Phil Wadlerは、これを「表現問題」と名付けました。 . 研究者の中には、Mixinなどの言語機能でこの問題を解決できると考えている人もいるが、広く受け入れられる解決策はまだ主流にはなっていない。

<ブロッククオート

関数型プログラミングが有利な典型的な問題定義は何でしょうか?

関数型言語は、シンボリックデータをツリー形式で操作することを得意としています。 例えばコンパイラでは、ソース言語と中間言語が滅多に変わらない(ほとんど同じ もの しかし、コンパイラは常に新しい翻訳やコードの改善、最適化(新しい操作)を追加しています。) コンパイルと翻訳は、関数型言語のキラーアプリと言えるでしょう。