使用Null对象模式时检查无效状态

时间:2009-06-30 10:06:15

标签: c# design-patterns null-object-pattern

使用Null Object模式时,如果情况无效,您将如何“检查”? 例如 如果在存储库中找不到任何项目,则向用户显示“未找到”消息。

我必须做一个美化的空检查吗?

  1. if obj.equals(new NullObject()){showNotFound(); }
  2. if obj.ID.equals(INVALID_ID){showNotFound(); }
  3. 这些技术似乎打败了Null Object模式本身的目的

4 个答案:

答案 0 :(得分:5)

问题是您在没有中性行为的场景中使用Null对象模式。除了马修所说的,使用这种模式只有在想要调用操作时才有意义,而不必担心引用为空。

c2.com wiki总结得很好:

  

我最近遇到过这个问题   使用null对象模式(请参阅   NullObjectAndRefactoring)。我的看法   如果应用程序代码需要   检查它是否使用NullObject   或不,那么系统不再   完全使用null对象模式,   因为NullObject类已经存在   从一个单纯的“提升”   实现细节成为一个   应用领域中的概念。

答案 1 :(得分:2)

在我看来,你是对的。如果您需要这种功能,只需使用null,并执行null检查并响应您的null状态。

就个人而言,我真的觉得这个有用的地方是'空'值是有意义的,你可以运行它,因此避免空检查。如果您需要空值(或无效值)语义,那么null是有意义的(如果您忘记检查它,将抛出异常,而不是默默地失败)。

答案 2 :(得分:1)

Null对象模式的目的主要是避免在想要调用可能为null的值的方法时进行空检查。但是因为你特别想要将null作为特殊情况来处理,所以无法绕过null检查。

进行空检查并不一定会破坏Null对象模式的目的,因为它可以帮助您避免程序中其他地方进行不必要的空值检查。

答案 3 :(得分:1)

以这种方式使用null对象不是Null对象模式,如果你确实想要使用模式,那么就可以。例如,如果您的对象具有Name属性,则只显示该对象,其中null对象将“未找到”消息显示为其名称...但它可能不适合您的工作方式。