Entityが状態を持つことの問題点
Entityはphaseによって複数の状態を取りうるが、それをどうmodelingするか
これをOrderという名前の1つのRecordで定義した場合にどういう問題が生じるか
こんな状態遷移をするとする
Unvalidated Order
→ Validated Order
→ Priced Order
こんなEntityを定義したとする
code:hs
data Order = Order
{ orderId :: OrderId
, isValidated :: Bool
, isPriced :: Bool
, amountToBill :: Maybe Flout
, ..
}
validateされたかどうかや、支払い済みかどうか、などをbooleanのflugで表現している
flugはあくまでも例であって、問題視しているのは複数の状態を持つことである
これがBooleanの何かであろうと、Intの何かであろうと問題である
複数の状態を持つモノ」を「1つのなにか」で表現しようとしている点に問題がある
問題点
Entityが状態を持ってしまう
型でどの状態にあるのかが判別できない
各所でflugを見て条件分岐が必要になる
ある状態では不要であるようなdataも全部一緒に管理することになる
だからMaybe型のようなfieldをたくさん持つことになる
例えば、Priced Orderのときには必須だが、Validated Orderのときには不要、といったdataも常に持ち歩くことになる
「あるMaybeのfieldに値が入っているときは、このflugはtrueになっている必要がある」のような条件を型で表現できない
例えば上の例で仕様が「amountToBillに値が入っているときは、isPricedはtrueになっていないといけない」など
これをコードに落とし込むためには、
コメントが必須であるし、
コメントがあるからと言って担保されるわけではないので運用でカバーになる 無駄に複雑になるのがわかるmrsekut.icon*4
ではどうするか?
参考