第15章. Javaへの関数的アプローチ
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
多くのプログラミング言語は、関数型プログラミングスタイルと命令型プログラミングスタイルの両方をサポートしている。 しかし、言語の構文と関数構造は、一般的に共通の問題に対する特定のアプローチを奨励する。 本書で取り上げるJDKに関数型が追加されたとしても、Javaは依然として命令型とオブジェクト指向プログラミングを好んでおり、コア・ライブラリの利用可能な型とデータ構造のほとんどは、この好みを反映している。
しかし、本書を通して述べてきたように、それはどちらか一方でなければならないという意味ではない。 完全に機能的でなくても、OOコードを機能的プリンシパルで補強することはできる。 両者の長所を併せ持つのはどうだろう? そのためには、機能的マインドセットを採用する必要がある。
この章では、これまで本書で学んだことをまとめ、関数型思考に影響を与える最も重要な側面に焦点を当てる。 また、関数型プログラミングテクニックを、オブジェクト指向環境に適したアーキテクチャレベルで実践的に適用する方法を示す。
OOPとFPの原則
機能的な原則があなたのコードを改善できる点をよりよく理解するためには、オブジェクト指向と機能的という両方のパラダイムの基本原則を再確認し、それらの相違点や相互接続の可能性を認識することが理にかなっている。 これにより、OOコードに機能的なアプローチを取り入れる機会や、無理に取り入れる意味がない点を特定するための基礎知識が構築される。
オブジェクト指向プログラミングの主な関心事は、データと振る舞いのカプセル化、ポリモーフィズム、抽象化である。 これは、問題を解決するためのメタファーに基づくアプローチであり、オブジェクトと接続コードは特定の問題領域を模倣する。 これらのオブジェクトは、インタフェースのようなパブリック・コントラクトを介したメッセージングによって相互作用し、それぞれが責任を持ち、通常は自身の状態を管理する。 このようなメタファーを使うことで、一連の命令を必要とするコンピューターと、自分の意図をわかりやすく表現できる開発者との間のギャップを埋めることができる。 OOPは、「現実世界」とその絶え間ない無限の変化に対応した命令型コードを構造化し、整理するための優れたアプローチである。
関数型プログラミングでは、数学的な原理を使って問題を解決し、宣言的なコードスタイルを用いる。 その基礎となるLambda微積分は、コードを「現実世界」のようにモデル化するメタファーを必要としない代わりに、データ構造と、高レベルの抽象化を用いたその変換のみを扱う。 関数は入力を受け取り、出力を生成する。 それだけだ! データと振る舞いはカプセル化されず、関数とデータ構造だけがカプセル化される。 FPは、並行環境での可変性状態の扱いや予期せぬ副作用など、典型的なOOPやJavaの問題の多くを、そもそも副作用を持たないようにすることで回避している。
この2つの短い要約は、オブジェクト指向プログラミングと関数型プログラミングの核となる原則の異同をすでに強調している。 OOPはコードの可動部分をなじみのあるドメインにカプセル化することで複雑さを抑えようとするのに対し、FPは数学的な原則に従うことで合計の部品数を少なくしようとする。 FPのより抽象的な思考法は、Javaを教えたり学んだりする最初のアプローチとしてOOPがしばしば好まれる理由である。 ...