私は自分の考えをいくつか共有し、いくつかの質問をしたいと思います ニュートラルな動作でクラスを実装することになっている Null オブジェクトの設計パターン。したがって、インターフェイスを実装する必要がある場合:
public interface IProduct
{
double Cost();
string Name();
}
おそらく、次の実装を使用します。
public class NullProduct : IProduct
{
public double Cost()
{
return 0.0;
}
public string Name()
{
return String.Empty;
}
}
罰金。
しかし、次のインターフェイスを実装する必要がある場合、どの戦略を使用する必要がありますか:
public interface IProduct
{
//other methods...
bool IsTasty();
}
IsTasty - 「ニュートラル」な動作はありません。NullProduct クラスにどのように実装すればよいですか? true または false を返します。いいえ、それほど明確ではありません。
さらに悪いことに、インターフェースにいくつかのプロパティがある場合:
public interface IProduct
{
//other methods...
int Price{get;set;}
}
と実装:
public class NullProduct : IProduct
{
//other methods...
int Price
{
get {return 0;}
set {/*nothing*/}
}
}
なんで?そのため、次のように、一部のユーザーがオブジェクトを取得する場合:
IProduct prod = GetSomeObject(); //GetSomeObject returns NullProduct
そしてユーザーは次のことを試みます:
prod.Price = 8;
Console.WriteLine(prod.Price);
ユーザーは奇妙な結果を得るでしょう。ユーザーは覚えています。彼は 8 ドルの価格を設定しましたが、現在は価格が 0 になっています。インフレですか。
UnitTest で同じ問題。
今、オブジェクトがnullオブジェクトかどうかを尋ねることでOCPに違反したくありません。
問題をどのように解決しますか?