【问题标题】:Is the null object pattern worth it?空对象模式值得吗?
【发布时间】:2010-11-17 03:21:06
【问题描述】:
【问题讨论】:
标签:
.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 有什么问题?有时我需要在延迟初始化的情况下区分 uninitialized 和 missing,但是我通常使用单独的布尔变量来指示状态,因此任何值(包括 null ) 对目标对象本身有效。
【解决方案5】:
关于 NULL 设计模式有很多误解,认为它有助于避免 NULL 检查。实际上 NULL 对象设计模式的副产品好处是你不需要做 NULL checl。但是 NULL 检查是好的并且需要。 NULL 设计模式填补了对象的缺失,应该在对象与每个对象协作时使用。
阅读这篇文章,详细讨论 NULL 对象设计模式
http://www.codeproject.com/Articles/1042674/NULL-Object-Design-Pattern
关于 NULL 设计模式的一些注释可以消除对该模式的混淆。
- NULL 设计模式使用 DEFAULT 行为填充对象的缺失,并且应该仅在一个对象与另一个对象协作时使用。
- NULL 设计模式并不意味着取代 NULL 异常处理。这是 NULL 设计模式的附带好处之一,但其目的是提供默认行为。
- 不应将NULL 检查替换为NULL 设计模式对象,因为它可能导致应用程序中的静默缺陷。
- NULL 设计模式在模拟单元测试和敏捷开发中很有用。
- NULL 类是应用单例设计模式并使类不可变的经典案例。
这种模式大多与装饰器和工厂模式结合使用。