Fowler PoEAA p. 498为什么以以下方式定义空对象模式(示例缩短,语言是c#,但并不重要):
public class Customer
{
public virtual string Name {get; set;}
}
public class NullCustomer : Customer, INull
{
public override Name
{
get { return "ImTheNull";}
// setter ommitted
}
}INull用作标记接口。我不太喜欢这种方法,原因有三:
为什么它不像这样实现:
public class Customer
{
public static readonly Customer NullCustomer = new Customer(){Name = "ImtTheNullCustomer";}
public string Name {get; set;}
}我发现所有的Fowler的例子都经过了很好的思考,很明显我在这里错过了一些东西。
发布于 2009-11-10 18:06:49
继承的原因是重写类的行为。在我看来,您的思考方式似乎是要检查您拥有的对象是否等于NullCustomer静态实例来作出决定,但是null对象的要点是维护Liskov代换原理。
换句话说,您使用null对象来设置引用,您将不会对它进行特殊检查,您将只使用它,它应该有一个不同的行为(实际上是缺少行为)。
发布于 2009-11-10 18:06:16
第二个例子的问题是,如果您的类有属于该类的其他项,则现在必须插入针对魔术的检查,以决定返回信息或其他适当的信息。
对于Null类,类返回最有意义的内容,而不需要这样的检查。
例如,customer类可能在适当询问DB之后返回该用户花费的美元总额。一个NullCustomer就可以return 0;了。使用神奇的值,它将从DB中获取虚拟用户的信息,或者在执行明智的操作之前必须运行另一个特定的检查。
发布于 2009-11-10 18:16:40
再加上他说的话。使用Null对象模式,以便有一组可以接受的缺省值。此外,如果您试图在MVC中使用NullCustomer,您仍然可以访问表示模型的对象,而不必考虑潜在的不存在的数据。检查空值
https://stackoverflow.com/questions/1709816
复制相似问题