我正在查看空对象模式,我想知道是否值得实现它或使用“if”检查我的代码intsead中的空值。当我查看实现时,似乎很难保持对象与其null实现很好地同步。通过对主对象进行更改,我们必须检查null对象是否按预期运行,并且很容易产生实现错误。不是吗?
修改
避免检查null:http://www.invisible-city.com/sharon/2009/03/null-object-pattern-when-slacker-is.html或http://journalofasoftwaredev.wordpress.com/2008/08/19/null-object-pattern-by-example/
答案 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设计模式的一些注释可以消除对这种模式的混淆。
这种模式主要与装饰者和工厂模式结合使用。