0

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

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

  1. 如果 obj.equals(new NullObject()) { showNotFound(); }
  2. 如果 obj.ID.equals(INVALID_ID) { showNotFound(); }

这些技术似乎违背了空对象模式本身的目的

4

4 回答 4

5

问题是您在没有中性行为的情况下使用 Null Object 模式。补充一下 Matthew 所说的,仅当您想要调用操作而不担心引用为空时,使用此模式才有意义。

c2.com wiki总结得很好:

我最近遇到了空对象模式的这个问题(请参阅 NullObjectAndRefactoring)。我的观点是,如果应用程序代码需要检查它是否使用 NullObject,那么系统根本不再使用空对象模式,因为 NullObject 类已经从单纯的实现细节“提升”为应用领域的一个概念。

于 2009-06-30T10:25:14.433 回答
2

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

就个人而言,我只有在“空”值有意义并且您可以使用它运行时才真正发现这很有用,因此避免了空检查。如果您需要 null 值(或无效值)语义,那么 null 是有意义的(如果您忘记检查它会抛出异常,而不是默默地失败)。

于 2009-06-30T10:16:01.643 回答
1

Null Object 模式的目的本质上是为了避免在您想要对可能为 null 的值调用方法时进行 null 检查。但是由于您特别想将空值作为特殊情况处理,因此无法绕过空值检查。

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

于 2009-06-30T10:26:33.633 回答
1

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

于 2009-06-30T10:39:59.707 回答