ファウラー PoEAA p. 498 null-object パターンを次のように定義します (サンプルは短縮されています。言語は c# ですが、問題ありません)。
public class Customer
{
public virtual string Name {get; set;}
}
public class NullCustomer : Customer, INull
{
public override Name
{
get { return "ImTheNull";}
// setter ommitted
}
}
INull
マーカーインターフェイスとして使用されます。私は次の 3 つの理由から、このアプローチがあまり好きではありません。
- プロパティは仮想としてマークする必要があります
- エンティティ クラスを封印できなくなりました
- 少なくとも (n+1) 個の新しい型が導入されています (n 個の null オブジェクト、1 個のマーカー インターフェイス)
なぜこのように実装されていないのですか:
public class Customer
{
public static readonly Customer NullCustomer = new Customer(){Name = "ImtTheNullCustomer";}
public string Name {get; set;}
}
一般的に、Fowlers の例はすべてよく考えられていることがわかりましたが、ここで見落としているものがあることは明らかです。