空对象模式值得吗?

时间:2009-08-05 19:26:01

标签: .net design-patterns oop domain-driven-design

我正在查看空对象模式,我想知道是否值得实现它或使用“if”检查我的代码intsead中的空值。当我查看实现时,似乎很难保持对象与其null实现很好地同步。通过对主对象进行更改,我们必须检查null对象是否按预期运行,并且很容易产生实现错误。不是吗?

修改

避免检查null:http://www.invisible-city.com/sharon/2009/03/null-object-pattern-when-slacker-is.htmlhttp://journalofasoftwaredev.wordpress.com/2008/08/19/null-object-pattern-by-example/

5 个答案:

答案 0 :(得分:4)

如果您的对象为null将在整个代码中成为常态,那么您也可以使用该模式。我在没有创建对象时检查是否为null,并且需要实例化。我并没有真正使用null作为其他任何东西,我当然不会用它来表示没有定义任何行为。

但是,如果您使用null表示尚未定义行为或默认行为是什么,那么肯定使用该模式。

答案 1 :(得分:2)

根据我的经验,我觉得保持Null-Object同步并不困难。如果您遇到此问题,您的对象可能会承担太多责任,因为它会发生很多变化。

我倾向于使用这种模式,如果我可以通过让默认行为很好地定义这样的对象。例如。查询操作的空对象是保持原始查询不变的。对其他对象的Null扩展是不执行任何操作的对象。

我发现它有时候是一个非常干净的模式,以避免使用ifs检查我的应用程序的某个状态可能存在或不存在的可选行为。

答案 2 :(得分:2)

我在使用我的工厂和IoC实现时使用空对象取得了巨大成功。它们对应用程序的垂直功能特别有用。我不会为你的应用程序的核心动作创建一个。

例如,您有一个IPrinter接口和几个实现它的对象--PrintX和NullPrinter。在IPrinter初始化中,您可以尝试启动PrinterX,但如果失败,则返回NullPrinter。在这种情况下,打印是应用程序的一项功能,但不是要求它成功运行。

答案 3 :(得分:0)

我确保我的IEnumerable项是空枚举而不是null,但如果确实缺少某些内容,那么null会出现什么问题?偶尔我需要在延迟初始化情况下区分未初始化缺少,但是我通常使用单独的布尔变量来指示状态所以任何值(包括{{1 }})对目标对象本身有效。

答案 4 :(得分:0)

有很多关于NULL设计模式的误解,它有助于避免NULL检查。实际上,NULL对象设计模式的副产品好处是你不需要做NULL checl。但是NULL检查很好并且需要。 NULL设计模式填充了对象的缺失,并且应该在对象与每个对象协作时使用。

阅读本文详细讨论NULL对象设计模式

http://www.codeproject.com/Articles/1042674/NULL-Object-Design-Pattern

关于NULL设计模式的一些注释可以消除对这种模式的混淆。

  1. NULL设计模式使用DEFAULT行为填充对象的ABSENCE,并且只应在一个对象与其他对象协作时使用。
  2. NULL设计模式并不意味着替换NULL异常处理。这是NULL设计模式的附带好处之一,但目的是提供默认行为。
  3. NULL检查不应该被NULL设计模式对象替换,因为它可能导致应用程序中的静默缺陷。
    1. NULL设计模式在模拟单元测试和敏捷开发中很有用。
    2. NULL类是应用Singleton设计模式并使类不可变的经典案例。
  4. 这种模式主要与装饰者和工厂模式结合使用。