てすと

たかろぐ

自分のログを刻みます。

関数型とオブジェクト指向

もう最近割と辛みを感じていたんですけど、だいぶ回復しました。

今日は、最近携わらせていただいているプロジェクトを進めたりしていましたが、 ここでは少し前に考えていた「関数型とオブジェクト指向」について少し書いてみようと思い立ちました。

概要

関数型も、オブジェクト指向プログラミングパラダイムのことです。 (プログラミングを書く時の"考え方"のことですね。他には手続き型とかあります。)

多分、エンジニアなら"オブジェクト指向"は誰でも聞いた事があるのではないかと思います。 Javaとかがその代表格ですね。

"関数型"は少し前まで自分も全然知らなかったので、結構知らない人も多いのではと思います。 有名なのはHaskellとかですかね。

上に挙げた2つのパラダイムは並列関係にあるので、よく「どちらを使うべきか」みたいな議論が起きたりしています。 どちらかを選択して、もう片方を切り捨てる考え方ですね、自分も少し前までこの考え方してました。

でも、実際にはこの2つのパラダイムは共存は可能らしいんですよね。 すると、次は「どう共存させるのか」という問題になります。

2つのパラダイムをどう使い分ける?

※あくまで、現時点で自分が考えていることなので、鵜呑みは厳禁でお願いしますね

結論から言うと、ベースとして関数型を採用して、論理的にデータをまとめたい時にVariable Objectsパターンを採用したクラスを使うと、 それぞれの良さをいい感じに引き出せるんじゃないかなと思っています。

Variable Objectsパターンについて、詳しくは以下を見てもらうとして、 個人的な感覚としては、状態が不変かつメソッドに副作用のないオブジェクトみたいな認識です。 そして、これが関数型の考え方とすごくマッチしている気がするんですよね!!

因みに、JavaScriptのプリミティブ型には、このパターンが採用されていると思います。(多分)

medium.com

関数型をベースに使っていると、「データとデータ」や「データと振る舞い」の間の結合が緩くなりがちなので、 そういった時にVariable Objectsパターンを採用したクラスを導入することで、関数型とオブジェクト指向、両方の恩恵を得ることができると思います。