値オブジェクトがNullを取る際の指針
#cleancode
概要
値オブジェクトがNullを取るとき、どう表現するのが正解なのかが見えない
例えNullだとしても、値オブジェクトのインスタンス化は必須なのか?それとも生成しないのか?
それぞれのメリット・デメリットを整理して、自分の指針を作っておく
指針(まとめ)
原則としては、Nullを値オブジェクトで扱わせるようにする
その値オブジェクトがドメイン的にNull(or 空値や0など)を許容できないなら、値オブジェクトを生成せずにNullとして扱う。
例えば、金額といった値オブジェクトはNullを0という形で許容できる。
そのような感じでドメイン的に値オブジェクトが空的な値を許容できるならNullを扱わせる。
逆に、電話番号と言ったNullを許容できない値オブジェクトでは、値オブジェクト自体を生成せずにNullとする。
参考情報
値オブジェクトのnull対応ってNullObjectパターンで良いのでは?
「値オブジェクトの中身がNullを許容するなら、その値オブジェクト用のNullオブジェクトを用意しておけ」という考え方
値オブジェクトを生成する際に与えられた値がNullの場合、Nullオブジェクトを返すように設計する
メリット
値オブジェクトの利用側が、いちいちNullかどうかで処理を分岐する必要がなくなる
Nulls in Value Objects
重要な質問
すべてのプロパティをnullにできる値オブジェクトがある場合、その値オブジェクト自体をnullする必要があるか?
それとも内部のプロパティをnullに設定して値オブジェクトを作成する必要があるか?
この問題から以下の選択肢に言い換えれる
値オブジェクトを利用するエンティティにNullをコントロールする責任があるのか?
= Nullable<ValueObject>
それとも値オブジェクト自身にNullをコントロールする責任があるのか?
= ValueObject<Nuulable>
結論から言うと...
1stアプローチとしてはValueObject<Nullable>を選択すると良い。
ただ、その値オブジェクトのプロパティがNull(or 空の値)を許容できないなら、Nullable<ValueObject>に。
例
電話番号などはNull値を許すことができない。そんなものは存在しないから。
なので、これはNullable<ValueObject>にせざるおえない
逆に、量やお金などの値オブジェクトなら、Null = 空 = 0と捉えることができる。
なので、これはValueObject<Nullable>にしたほうがいい
理由
Nullの取り扱いが減る
Nullの取り扱いはマジで面倒。if obj is Nullとかいう分岐が出てくるのが本当にしんどいonigiri.w2.icon