generated at
色々なValue Object

Recordなどの複合物をwrapしたValue Object
最も基本的なValue Objectと言える
FP系の言語だと、idを持たないRecordは全て自然にこれになる
例: 座標
hs
data Point = Point { x :: Double, y :: Double }


Primitive値をwrapしただけのValue Object
primitive値なので自然にValue Objectになる
それ加えて、validaitonの機能を持たせたり、同じ型の中で分節を作っている
例: email
hs
newtype Email = Email String


Value Objectを内部に含むValue Object
上記2つの組み合わせで自然にValue Objectになる
例: full name
hs
data FullName = FullName { first :: FirstName, last :: LastName } newtype FirstName = FirstName String newtype LastName = LastName String
例: 窓様式
VOである窓を内部に含む



Entityを内部に含むValue Object
例: 高速道路の経路
hs
-- CityとHighwayを表すEntity data City = City { id :: Int, name :: String } deriving (Show) data Highway = Highway { id :: Int, name :: String } deriving (Show) -- Routeを表すValue Object data Route = Route { startCity :: City, endCity :: City, viaHighway :: Highway } deriving (Show) sanFrancisco = City 1 "San Francisco" losAngeles = City 2 "Los Angeles" pacificCoastHighway = Highway 1 "Pacific Coast Highway" scenicRoute = Route sanFrancisco losAngeles pacificCoastHighway
出発点( City )、目的地( City )、それを繋ぐ高速道路( Highway )は、いずれもEntity
それらの複合物である経路( Route )はValue Object
この例は、中間tableはValue Objectと同じmrsekut


mutableなValue Object
以下のような場合はmutableにすることを考慮に入れてもいい
値が頻繁に変化する場合
Objectの生成や削除が高く付く場合
置き換えによって(修正ではなく)クラスタリングが妨げられる場合
値を共有することがあまりない場合、またはクラスタリングを改良するためや他の技術的理由からそういう共有を見合わせる場合
勿論mutableにするなら、値の共有はできなくなるmrsekut