Model周りの概念整理
Model
ドメインモデル
- プログラミング言語で表現されたドメインの概念
- ↓みたいなイメージ
@dataclass
class User:
name: str
age: int
ドメインモデルに含まれるもの
Value Object
- 値を表現するオブジェクト
- 金額や単位を表すことが多い
- プリミティブ型をラップし、ドメインオブジェクトとして扱う為のテクニック
- ↓の事例ではPrice(金額)をクラスとして定義している
class Price:
def __init__(self, price):
self._price = price
@property
def value(self):
return self._price
if __name__=='__main__':
p = Price(100)
print(p.value) # <= 100
- 本来int型で表現できる「金額」をあえて「Price型」として定義することで、型チェックなどの言語機能を利用することが可能になる
- ここでは省略しているが、例えばマイナスの値を受け付けないように入力チェックを行うなど「金額」として正しい状態を保つ処理を付与することもできる
Enum
- 区分値を表現する
- 入力値チェックを兼ねる
- 型で表現できる
- 計算可能ならValue Object、計算不要ならEnum
- 型を明示しつつ、区分値を扱える
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
BLUE = 3
Entity
- ドメインモデルの集合体
- ビジネスロジックの中で意味のあるデータのまとまり
- 永続化の単位とも言われることもある(O/Rマッパー的な扱い)
ドメインモデルに含まれないもの
DBのテーブル
- ドメインモデルのデータがシリアライズされたものであり、ドメインモデルではない
フォームやAPIから入力
- ドメインモデルの入力値やキーになるが、ドメインモデルそのものではない
ドメインモデルではないもの
DBのテーブル
- ドメインモデルのデータがシリアライズされたものであり、ドメインモデルではない
- そもそもテーブル構造とドメインモデルが一致するとは限らない
O/Rマッパーのクラス
- 個人的な意見だが、O/Rマッパーのクラスはドメインモデルとは呼ばない
- あくまでもインフラ層のラッパーという扱い
- Data Access ObjectやData Mapperの同類して扱う