【问题标题】:Is the null object pattern worth it?空对象模式值得吗?
【发布时间】:2010-11-17 03:21:06
【问题描述】:

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

编辑

避免检查 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/

【问题讨论】:

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


【解决方案1】:

如果您的对象为 null 将成为整个代码中的规范,那么您不妨使用该模式。当一个对象还没有被创建并且它需要被实例化时,我会检查null。我并没有真正将 null 用于其他任何事情,我当然不会用它来表示未定义任何行为。

但是,如果您使用 null 来表示尚未定义行为或默认行为什么都没有,那么请务必使用该模式。

【讨论】:

    【解决方案2】:

    根据我的经验,我认为保持 Null-Object 同步并不难。如果你确实有这个问题,你的对象可能有太多的责任,因为它会发生很多变化。

    如果我可以真正定义这样一个对象,让默认行为很好地流动,我倾向于使用这种模式。例如。查询操作的空对象是保持原始查询不变的对象。对其他对象的空扩展是什么都不做的。

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          阅读这篇文章,详细讨论 NULL 对象设计模式

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

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

          1. NULL 设计模式使用 DEFAULT 行为填充对象的缺失,并且应该仅在一个对象与另一个对象协作时使用。
          2. NULL 设计模式并不意味着取代 NULL 异常处理。这是 NULL 设计模式的附带好处之一,但其目的是提供默认行为。
          3. 不应将NULL 检查替换为NULL 设计模式对象,因为它可能导致应用程序中的静默缺陷。
            1. NULL 设计模式在模拟单元测试和敏捷开发中很有用。
            2. NULL 类是应用单例设计模式并使类不可变的经典案例。

          这种模式大多与装饰器和工厂模式结合使用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-04-29
            • 2015-11-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多