データ指向プログラミング(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からデータ指向推し
- Java21からの「データ指向」は「オブジェクト指向」と何が違うのか - 開発めもとか
- Java 20, 21, オブジェクト指向からデータ指向へ / Java20, 21, Object Oriented to Data Oriented - Speaker Deck
Insights
✨Clojureをつかうと勝手にデータ指向プログラミング
Clojure界隈でこの用語がとても流行っているようにおもうが, その本質はClojureというのがAssociative Map(clojure.core.map)をフル活用するからだと思う. 💡ClojureのMapは素でマッチョだからだ. Mapから派生したRecordやednも, 結局Mapの操作でなんでもできる.
そしてそれを支えるるがMapの性質としてよく語られる📝不変性(immutable)だったり, 参照透過性だったりの関数型パラダイムなのだろう.
Clojureのライブラリにはデータ指向に近いライブラリがたくさんあり, それらを組み合わせることであまり意識しなくてもデータ指向プログラミングをしていることになる.
🔗References
- Data-Oriented Programming - Yehonathan Sharvit, Manning
- What is Data Oriented Programming? | Yehonathan Sharvit
📚Data-Oriented Programming by Yehonathan Sharvit
Data-Oriented Programming の書籍を書いた人. Manningより出版.
この書籍はJavaで書かれている. おそらく, Clojureではこのパラダイムはよく知られているので, 他の言語のコミュニティへ紹介したいという意図がありそう.
2021に投稿されたYoutube動画はいくつもあるがだいたいスライドは同じ.
- Data Oriented Programming in Practice - Yehonathan Sharvit - YouTube
- Data-Oriented programming - slide
どちらかというとblogに書籍の内容の一部が書いてあるのでこっちがわかりやすかった.
- https://blog.klipse.tech/
- Data-Oriented Programming: A link in the chain of programming paradigms
- Principles of Data Oriented Programming | Yehonathan Sharvit
Related
up: 📂ソフトウェア設計