データ指向プログラミング(Data-Oriented Programming)まとめ.

データ指向プログラミングとは

データ指向プログラミング(Data-Oriented Programming, DOP). データ駆動型プログラミング(Data-Driven Programming)とも呼ばれる.

データ駆動設計(Data-DrivenArchitecture)と混同しがち. これはドメイン駆動設計の業界用語.

Data-Oriented Programmingの方が🔖Clojure界隈で使われているようだ.

またデータ指向設計(Data-Oriented Design)という用語がゲーム業界やC++界隈で使われているように見える(たぶん違う概念). しかし, データ指向プログラミングといいつつ, カテゴリ的には設計原則なのでさらに紛らわしいい…

データ指向プログラミングのコンセプト

📚Data-Oriented Programming by Yehonathan Sharvitより.

  • Separate code from data.
  • Model entities with generic data structures
  • Data is immutable
  • Data is Comparable by value
  • Data has a literal representation

Thinking in Dataの動画もよい.

ClojureはDefaultでData-Oriented Programmingできるので, どちらかというとClojureのDataに対する設計思想みたいなものが感じられた.

data as code example

コードをデータとして扱う. 以下具体例.

Ant

Javaのビルドツール.

  • data: XMLでビルド, メンテナンス, テストなどの仕様を記述して
  • code: Ant プログラムでbuild.xmlを読み込んで処理を実行, xxx.jarを生成.

XMLで記述していくところに拡張性の無理があったが, こうやって宣言的に仕様を定義するところにはインサイトがあった.

Clojure Compiler

Clojureのcompilerは, Clojureのcodeをdataとして受け取り(data as code), 評価して別のデータやコードを返す.

client-server model

Web ServerはClientからJSONを受取り, なんらかの処理をしてJSONを返す.

first-class data

(詳しく調べてないのであとで書き直す可能性あり).

おそらく最近できた造語で, 第一級オブジェクト(first-class object) の中で特にデータに着目してプログラムを組み立てるときの文脈で出る言葉.

データはImmutableでPersistent. ドメイン駆動設計の値オブジェクト.

データ指向プログラミングTopics

オブジェクト指向プログラミングとの比較

オブジェクト指向(OO)ではドメインをオブジェクトでモデリングする. オブジェクトはMutableなデータ(aka. 状態)とそれを操作する特定の関数をひとつのデータとして扱う.

  • Write code as methods inside classes
  • Encapsulate data as members inside classes

データ指向(DO)ではドメインをImmutableなデータの集合でモデリングする. データは関数で操作するが, その関数は汎用的=特定のデータに依存しない.

OOの世界では, 世界をオブジェクトでモデリングすることを徹底的に洗脳される. その結果データは透明性を失い, 汎用的な関数による操作もできない.

カプセル化やインタフェースはMutableなデータを扱う上でのGood Practiceであるが, そもそもデータ構造が同じでImmutableであればいいのでは?という話になる.

cf. 📝オブジェクト指向プログラミング

関数型プログラミングとの比較

データを第一級データ(First-Class Data)をベースにしてプログラムを組み立てるのがデータ指向の考え方.

一方, 関数型プログラミングは第1級関数が大事な概念.

first-class Data = first-class object - first-class function

データ指向という言葉自体がまだ知名権を獲得していない造語のイメージがある. 関数型プログラミングとして慣れ親しんでいるパラダイムの中で, さらに不定普遍のデータを中心にプログラムを書いていこうという想い.

cf. 📝関数型プログラミング

💡Java21からデータ指向推し


Insights

✨Clojureをつかうと勝手にデータ指向プログラミング

Clojure界隈でこの用語がとても流行っているようにおもうが, その本質はClojureというのがAssociative Map(clojure.core.map)をフル活用するからだと思う. 💡ClojureのMapは素でマッチョだからだ. Mapから派生したRecordやednも, 結局Mapの操作でなんでもできる.

そしてそれを支えるるがMapの性質としてよく語られる📝不変性(immutable)だったり, 参照透過性だったりの関数型パラダイムなのだろう.

Clojureのライブラリにはデータ指向に近いライブラリがたくさんあり, それらを組み合わせることであまり意識しなくてもデータ指向プログラミングをしていることになる.

🔗References

📚Data-Oriented Programming by Yehonathan Sharvit

Data-Oriented Programming の書籍を書いた人. Manningより出版.

この書籍はJavaで書かれている. おそらく, Clojureではこのパラダイムはよく知られているので, 他の言語のコミュニティへ紹介したいという意図がありそう.

2021に投稿されたYoutube動画はいくつもあるがだいたいスライドは同じ.

どちらかというとblogに書籍の内容の一部が書いてあるのでこっちがわかりやすかった.

up: 📂ソフトウェア設計