色々なValue Object
Recordなどの複合物をwrapしたValue Object
最も基本的なValue Objectと言える
FP系の言語だと、idを持たないRecordは全て自然にこれになる
例: 座標
hsdata Point = Point { x :: Double, y :: Double }
Primitive値をwrapしただけのValue Object
primitive値なので自然にValue Objectになる
それ加えて、validaitonの機能を持たせたり、同じ型の中で分節を作っている
例: email
hsnewtype Email = Email String
Value Objectを内部に含むValue Object
上記2つの組み合わせで自然にValue Objectになる
例: full name
hsdata 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
mutableなValue Object
以下のような場合はmutableにすることを考慮に入れてもいい
値が頻繁に変化する場合
Objectの生成や削除が高く付く場合
置き換えによって(修正ではなく)クラスタリングが妨げられる場合
値を共有することがあまりない場合、またはクラスタリングを改良するためや他の技術的理由からそういう共有を見合わせる場合
勿論mutableにするなら、値の共有はできなくなる
