値オブジェクトは以下の3つの要素を持ったオブジェクトだとされている。 1)不変である(一度インスタンスが作られたら、それが保有する属性の値は変化してはいけない) 2)交換が可能である(再代入=交換によってのみ値を変更することができる) 3)等価性によって比較される このうち、3)は絶対に必要なんだろうか? 例えば、Date型にかなり近い、YearMonth(年と月をもったオブジェクト)を定義してみよう。 class YearMonth attr_reader :date def initialize(year, month) @date = Date.new(year, month, 1) end end 一応値オブジェクトとして定義しているものの、「日付が1日のDate型オブジェクト」」としても外部から認識できる。なら、YearMonthそのものを比較できなくても、保有しているDate型