データ指向プログラミング
データ指向プログラミング(DOP)とは
- プログラムをデータと処理に分解し、データの流れに沿って設計するプログラミングスタイル
- DOPではプログラミングをデータを変換することだと定義している
データ指向プログラミングの4原則
(1) コード (振る舞い) をデータから切り離す
- OOPではデータと振る舞いをまとめる(クラス)
- DOPではデータと振る舞いは分離される(データと関数)
(2) データを汎用的なデータ構造で表す
- クラスでデータ構造を定義しない
- MapやList型でデータを表現する
(3) データをイミュータブルとして扱う
- データはイミュータブルなものとして扱い、変更しない
- 変更する場合は全体をコピーして新しいイミュータブルなデータを作る
(4) データスキーマをデータ表現から切り離す
- データ本体とデータスキーマ(とそれによるバリデーション)を分離して管理する
- 例えば、データをJSON、データスキーマをJson Schemaで管理するというような
- OOPのようにクラスにマッピングしたりはしないという感じ
コードとデータの分離
- OOPにおけるクラスのような静的なデータ定義は持たない
- ハッシュマップやリストのような汎用的なデータ型を利用し、ステートレスな関数でデータを操作・変換する
- 要するに関数型プログラミングのスタイル
DOPの利点
システムを理解しやすくなる
- 素朴なデータ構造とそれを操作・変換する関数でシステムが構成されるのでOOPでありがちなブラックボックスや過度な抽象化・継承ツリーが発生しない為、システムを理解しやすくなる
- [MEMO]
柔軟な機能追加を可能になる
- ステートレスな関数とイミュータブルなデータでシステムが構成されるので、機能追加(関数の追加)が容易かつ安全に行える
- OOPでは基底クラスに手を入れると意図しない影響が発生するなど機能追加が難しい場合があった
言語に依存せず、学習内容の可搬性が高い
- 素朴なデータ構造と関数というどの言語にも備わっている機能が主要な道具になるので、言語機能に依存しない
- 特定の言語の特定機能にロックインされるというような事は起きにくい
所見
- カプセル化によるデータの保護とメソッドによる許可された操作のみ可能にするというOOPのメリットがバッサリ無くなってしまう事についての懸念はある
- 意図せぬデータ変更を検知・抑制できないのではないか?
- クラスにデータと操作をまとめるのは、コードの影響範囲を局所化するという目的もある
- データを全てのコードに公開してしまうと、あるデータに対する操作が複数のモジュールに分散することを防ぐことができない
- そのような状況でバグが発生した場合の調査・修正は悪夢になるように思うのだが
参考資料