c++ - 空检查空对象模式

标签 c++ design-patterns object null

空对象模式的主要目标是确保向客户端提供可用的对象。所以我们要替换下面的代码...

void Class::SetPrivateMemberA() {
    m_A = GetObject();
}

void Class::UseA() {
    if (m_A != null) {
        m_A.Method();
    } else {
        // assert or log the error
    }
}

...使用此实现:

void Class::SetPrivateMemberA() {
    m_A = GetObject();
}

void Class::UseA() {
    m_A.Method();
}

我想到的问题是 GetObject() 仍然返回一个对象,一个 NULL 对象或其他。我喜欢不重复检查 null 并相信发回的对象可用的想法,但我为什么不在第一个实现中就这样做呢?

Null Object 模式的优势是否只是稍微增加了清理代码的信任度?对于第二个实现,在调用 A.Method() 之前检查它是否不为 null 是否仍然不是一个好习惯?

最佳答案

你是对的,如果你确定你永远不会返回空值,只需在你的第一个实现中调用方法之前跳过空值检查。同样,如果您确实需要在 UseA() 需要对 null 对象做一些不同的事情的情况下做一些特殊的事情,那么您无论如何都需要显式检查 null 对象。但是,空对象模式真正有用的是那些无关紧要的情况。

以大多数观察者模式为例。如果您将观察者模式实现为只能有一个观察者的类的成员,并且想向观察者宣布您的类做了某事,那么观察者是否为 null 对类来说并不重要。

这也用空容器类进行了说明,它们本质上是空对象模式:不是从查询中返回空容器,而是简单地返回一个空容器。对于像遍历容器的所有条目这样的事情,它是否为空通常无关紧要,因此摆脱空检查的需要使代码更易于维护/更具可读性。但是,如果您想填充数据集的 View ,您仍然需要明确显示不同的“无条目”。检查空容器。

为清晰起见进行编辑

一个问题是只从调用站点看。像大多数设计模式一样,这需要包含双方才能得到充分利用。考虑:

public PossiblyNull GetSomethingNull()
{
    if (someBadSituation())
        return null;
    else
        return SomehowProduceSomething();
}

对比

public PossiblyEmpty GetSomethingEmpty()
{
    if (someBadSituation())
        return StaticEmptySomething();
    else
        return ProdueSomethingYay();
}

现在,你的调用代码,而不是看起来像

public void DoSomethingWithChild(Foo foo)
{
    if (foo != null)
    {
        PossiblyNull bar = foo.GetSomething();
        if (bar != null)
            bar.DoSomething();
    }
}

可以

public void DoSomethingWithChild(Foo foo)
{
    if (foo != null)
        foo.GetSomething().DoSomething();
}

关于c++ - 空检查空对象模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2367597/

相关文章:

c++ - 在处理低级字节操作时 reinterpret_cast 不好吗?

c++ - 无法从大括号括起来的初始值设定项列表转换为结构

wpf - MVVM 模式是 MVC + PAC 模式的共生体吗?

design-patterns - 设计一个文件系统

javascript - jQuery - 将对象数组与数字进行比较并追加

javascript - 映射键值以使用 javascript 创建具有嵌套对象的 json 结构

c++ - 在 C++ 中将 float 截断为最接近的 2 的幂 - 性能

c++ - qt+mysql交互问题

ruby-on-rails - 在 Ruby on Rails 中为一个模型设置两个 Controller 是不好的做法吗?

java - 2 "linked"对象