TL;DR
- 関数型プログラミングとは、関数がとても重要であるかのようにプログラミングすることで、関数をあらゆる場所で使う。
- オブジェクト指向プログラミングとはスタイルだけでなく考え方が違うので、根底にある課題をどう解くかから考える。
内容
Understanding Functions の一節である。
オブジェクト指向プログラミングとの対比
関数型プログラミングでは、関数をあらゆる場所で、あらゆるものに使う。オブジェクト指向プログラミングと比べると、次のような違いがある。
- 大きなプログラムを小さな部品で組み立てるとき、オブジェクト指向ではクラスやオブジェクトを部品にする。関数型では関数を部品にする。
- プログラムの一部をパラメータ化したり、コンポーネント間の結合を弱めたりするとき、オブジェクト指向ではインタフェースや依存性の注入を使う。関数型では関数でパラメータ化する。
- DRY に従って多くのコンポーネントでコードを再利用したいとき、オブジェクト指向では継承や Decorator パターンを使う。関数型では再利用できるコードを関数にまとめ、関数合成で組み合わせる。
考え方の違い
これは単なるスタイルの違いではなく、プログラミングに対する考え方が違うことを理解する必要がある。別のパラダイムで生まれた疑問に、そのまま答えようとしてはいけない。たとえば「コレクションをループするにはどうするか」「Strategy パターンを実装するにはどうするか」という疑問である。
代わりに、その疑問が解決したかった根底の課題をどう解くかを考える。先の例なら、「コレクションの各要素にアクションを実行するにはどうするか」「振る舞いをパラメータ化するにはどうするか」と問い直す。