Docs 一覧に戻る

2026-03-02-what-is-dop.md

データ指向プログラミング (DOP) と設計パラダイムのまとめ

現代のソフトウェア開発において、複雑な状態管理を攻略するための強力な武器となる「データ指向プログラミング(DOP)」。その本質と、他パラダイムとの違い、そしてReactやイベントソーシングへの応用について記述します。


1. プログラミングパラダイムの比較

「データ」と「振る舞い(ロジック)」をどう配置するかという視点で、3つの主要なパラダイムを比較します。

特徴 オブジェクト指向 (OOP) 関数型プログラミング (FP) データ指向プログラミング (DOP)
基本単位 オブジェクト(状態+振る舞い) 関数(純粋な変換) 汎用データ構造 + 純粋関数
データの扱い カプセル化(隠蔽する) 数学的対象(抽象化する) 透明な事実(剥き出しにする)
状態の変更 ミュータブル(自身を書き換える) イミュータブル(変更を許さない) イミュータブル(新しい事実を作る)
設計思想 自律する生き物の社会 数学的なパイプラインの連鎖 透明な記録の加工と変換

パラダイム間の関係性

  • OOP vs DOP: OOPはデータとロジックを「結合」して複雑さを隠しますが、DOPはそれらを「分離」して見通しを良くします。
  • FP vs DOP: 両者は「不変性」を重んじる親戚ですが、FPは関数の合成や型理論に重きを置き、DOPはデータの扱いやすさと汎用性に重きを置く「実務的」なアプローチです。

2. DOPの4つの原則

DOPを実践するための設計指針です。

  1. コードとデータの分離: ロジックはデータを引数に取る「純粋な関数」として実装する。
  2. 汎用的なデータ構造: 特定のクラスに依存せず、MapやListなどの標準的な構造でデータを表現する。
  3. データの不変性 (Immutability): 一度作成したデータは書き換えず、変更時は新しいデータを作成する。
  4. スキーマと表現の分離: 「データの形」の検証は、データ構造そのものではなく、境界線のバリデーション層で行う。

3. ReactとDOPの密接な関係

Reactが「宣言的UI」を実現できている背景には、DOPの思想が深く根付いています。

  • $UI = f(state)$: コンポーネントは「データ(State)」を受け取って「UI(DOM)」を返すだけの投影関数です。
  • 不変性の強制: useStateRedux において、Stateを直接書き換えず新しいオブジェクトを作るルールは、DOPの原則そのものです。
  • 予測可能性: データが不変であれば、Reactは参照の比較だけで再描画を最適化でき、開発者は「なぜこの表示になったのか」をデータから即座に特定できます。

4. イベントソーシングへの応用と整合性

DOPは、過去の事実を積み重ねる「イベントソーシング」と最高に相性が良い設計です。

複数リソースの整合性

DOPではシステムの状態を「1つの大きな不変のステートツリー」として捉えます。1つのイベントが「在庫」と「注文」の両方に影響を与える場合でも、**単一の純粋関数(Reducer)**がそれらを一括で新しいステートへ変換します。

$$State_{new} = applyEvent(State_{old}, Event)$$

このプロセスは数学的にアトミック(不可分)であり、DBのトランザクションに依存せずとも、アプリケーションレイヤーで強力な整合性を担保できます。

スナップショットと永続化

データが単なる汎用構造(JSON等)であるため、現在の状態を「スナップショット」として保存し、後から復元する作業が非常に低コストで行えます。クラスのインスタンス化に伴う複雑な副作用を考慮する必要がありません。


5. 結論:なぜ今DOPなのか

大規模なシステム、特に「情報の加工」と「非同期な通信」が中心の現代のWebアプリでは、DOPは以下のメリットをもたらします。

  • 認知負荷の低減: 「データはただのデータである」というシンプルさが、コードを読む際の迷いを消します。
  • テストの容易性: 複雑なセットアップなしに、データを関数に渡すだけでロジックを検証できます。
  • 時間軸の管理: 不変データのおかげで、過去の状態(Undo)やデバッグ時の再現が極めて容易になります。