OOPは可変状態と動作を束ねるオブジェクトの周りにコードを組織します。一方、関数型プログラミング(FP)は純関数と不変データの周りにコードを組織し、計算をデータ変換として扱います。これらは対立するものではなく、異なるデフォルトの偏りであり、ほとんどのモダン言語は両方を混合しています。
OOPは可変状態と動作を束ねるオブジェクトの周りにコードを組織します。一方、関数型プログラミング(FP)は純関数と不変データの周りにコードを組織し、計算をデータ変換として扱います。これらは対立するものではなく、異なるデフォルトの偏りであり、ほとんどのモダン言語は両方を混合しています。
| OOP | FP |
|---|
| ユニット | オブジェクト(状態+メソッド) | 関数 |
| 状態 | カプセル化、しばしば可変 | 不変;副作用を避ける |
| ポリモーフィズム | サブタイピング/動的ディスパッチ | 高階関数、ジェネリクス |
| 型を追加 | 簡単(新しいクラス) | 難しい(すべての関数に触れる) |
| 操作を追加 | 難しい(すべてのクラスに触れる) | 簡単(新しい関数) |
最後の行は表現問題です。各パラダイムは変更の一つの軸を簡単にし、もう一つを難しくします。
# OOP: data + behavior together, dispatch by type
class Circle:
def __init__(self, r): self.r = r
def area(self): return 3.14159 * self.r ** 2
# FP: data is dumb; behavior is a separate pure function
def area(shape):
match shape:
case ("circle", r): return 3.14159 * r ** 2
case ("square", s): return s * s
OOP → rich domains with identity & lifecycle (orders, sessions, UI widgets)
FP → data pipelines, transformations, concurrency (immutability avoids races)
モダン言語はマルチパラダイム(Scala、Kotlin、Python、モダンJava/C#)なため、実践的なスキルは「問題ごとに正しいツールを選択する」ことであり、部族を選ぶことではありません。
FPの不変性と純関数への強調はOOPのベストプラクティスを再形成しました — 不変値オブジェクトと動作の依存性注入は、FPの考え方であり、今や優れたOO設計の標準です。