最終更新:

【図解で比較】オブジェクト指向 vs 関数型プログラミング — 2大パラダイムの違いを徹底解説


オブジェクト指向 vs 関数型プログラミング オブジェクト指向 (OOP) Animal クラス データ: 名前, 鳴き声 操作: 鳴く(), 食べる() 状態を内部に保持 Dog ワン! Cat ニャー! 継承・カプセル化で管理 VS 関数型 (FP) 入力データ 関数 f 新しいデータ 関数 g 出力データ 純粋関数 不変データ 関数の合成 データ変換のパイプライン
オブジェクト指向と関数型プログラミングの設計アプローチ比較
ひよこ ひよこ

オブジェクト指向関数型プログラミングってよく聞くけど、何がどう違うの?

ペンギン先生 ペンギン先生

ざっくり言うと、「モノ(オブジェクト)を中心に考える」のがオブジェクト指向で、「処理(関数)を中心に考える」のが関数型だよ。オブジェクト指向はデータと操作をひとまとめにした「クラス」を作って、それを組み合わせて設計する。関数型はデータを受け取って新しいデータを返す「純粋関数」を組み合わせて設計するんだ。

ひよこ ひよこ

オブジェクト指向のクラスとか継承って、具体的にはどういうこと?

ペンギン先生 ペンギン先生

たとえば「動物」というクラスを作って、その中に「名前」や「鳴き声」というデータと、「鳴く」という操作をまとめる。そこから「犬」や「猫」を継承で派生させれば、共通部分は再利用しつつ個別の振る舞いだけ上書きできる。カプセル化で内部のデータを外から直接触れないようにして、安全に管理するのもオブジェクト指向の特徴だね。

ひよこ ひよこ

じゃあ関数型のほうはどういう考え方なの?

ペンギン先生 ペンギン先生

関数型の柱は3つ。まず「純粋関数」で、同じ入力には必ず同じ出力を返す関数のこと。次に「イミュータビリティ(不変性)」で、一度作ったデータは変更しない。変えたいときは新しいデータを作る。最後に「高階関数」で、関数を引数に渡したり、関数を返す関数を作ったりできる。mapやfilterがその代表例だよ。

ひよこ ひよこ

状態の管理の仕方がだいぶ違いそうだね?

ペンギン先生 ペンギン先生

そこが最大の違いと言ってもいいくらい。オブジェクト指向ではオブジェクトが内部に「状態」を持っていて、メソッドで状態を変更していく。関数型では状態を直接変えずに、データを変換して新しい状態を作る。オブジェクト指向は「この犬の名前をタロウに変更する」、関数型は「名前がタロウになった新しい犬データを作る」というイメージだね。

ひよこ ひよこ

それぞれの代表的な言語って何があるの?

ペンギン先生 ペンギン先生

オブジェクト指向の代表はJavaC#。関数型の代表はHaskellElixirClojureあたりだね。ただ最近は「マルチパラダイム」の言語が主流で、JavaScriptPythonScalaオブジェクト指向と関数型の両方の書き方ができる。どちらか一方だけという時代ではなくなってきているよ。

ひよこ ひよこ

Reactのフックも関数型の影響を受けてるって聞いたことがあるよ!

ペンギン先生 ペンギン先生

いいところに気づいたね。Reactは元々クラスコンポーネントでオブジェクト指向的に書いていたけど、Hooks登場以降は関数コンポーネントが主流になった。useStateやuseEffectは、状態を直接変えるのではなく「新しい状態をセットする」という関数型の考え方に近い。UIを「状態から画面への変換関数」と捉えるのは、まさに関数型の発想だよ。

ひよこ ひよこ

結局どっちを使えばいいの?

ペンギン先生 ペンギン先生

大規模なシステムで複雑なビジネスロジックをモデリングするなら、オブジェクト指向の整理力が活きる。データ変換やパイプライン処理、並行処理が多い場面では関数型が強い。実務では両方のエッセンスを混ぜて使うのが一番多いパターンだね。

ひよこ ひよこ

ベテランの人はもっと深い使い分けとかしてるの?

ペンギン先生 ペンギン先生

関数型の世界には「モナド」という概念があって、副作用を型で安全に管理する仕組みがある。怖い名前だけど「処理の順序を保証する箱」くらいのイメージで大丈夫。並行処理ではErlang/Elixirの「アクターモデル」がオブジェクト指向と関数型の中間みたいな設計で注目されているよ。Rustは所有権システムで状態管理の安全性を言語レベルで保証していて、両パラダイムのいいとこ取りを目指した設計と言えるね。

ひよこ ひよこ

どっちかに決めなきゃって思ってたけど、組み合わせるのが大事なんだね!

ペンギン先生 ペンギン先生

そのとおり。現代のプログラミングは「オブジェクト指向 vs 関数型」ではなく「オブジェクト指向 and 関数型」の時代。それぞれの強みを理解して、場面に応じて使い分けられるのが一番の武器になるよ。