注: 例として C# を使用しますが、Java や他の多くの言語でも問題はほぼ同じです。
値オブジェクトを実装し ( M. Fowler による値オブジェクト パターンのように)、null 可能なフィールドがあるとします。
class MyValueObject
{
// Nullable field (with public access to keep the example short):
public string MyField;
}
次に、Equals() をオーバーライドするときに、両方の値オブジェクトの MyField が null に設定されている場合をどのように処理しますか? それらは等しいかどうか?
C# では、次の理由から、それらを同等に扱うことは明らかです。
これは、クラスの代わりに C# 構造体を使用し、Equals() をオーバーライドしない場合の Equals() の動作です。
次の式は true です。
null == null object.ReferenceEquals(null, null) object.Equals(null, null)
ただし、SQL では (少なくとも SQL Server の方言では)、NULL = NULL
は false ですが、NULL is NULL
は true です。
O/R マッパー (私の場合は NHibernate) を使用する場合、どのような実装が期待されるのか疑問に思っています。「自然な」C# 等価セマンティクスを実装すると、O/R マッパーがそれらをデータベースにマップするときに悪影響が生じる可能性がありますか?
それとも、値オブジェクトで null 許容フィールドを許可するのは間違っているのでしょうか?