c++ - 当类在某些情况下无法运行时,如何禁用类 API?

标签 c++ class c++11 factory

假设我有以下内容:

class Processor
{
public:
    void Activate();
    /* some more interface functions*/
};

void main()
{
    Processor().Activate();
}

class Processor 只是提供公共(public)接口(interface)的任何类的示例。

问题

如果满足某些条件,Processor 可操作怎么办。例如,Processor 类正在对目录 X 执行一些文件系统操作,如果目录 X 不存在,则无法操作根本。

问题

谁负责验证条件是否满足以及类是否可以运行?


让我们将评估这些条件封装到一个名为 Enabled()

的逻辑函数中

建议1——来电者责任

void main()
{
    if (Enabled() )
        Processor().Activate();
}

在这种情况下,Processor 类的发起者负责确保在发起类之前满足这些条件。

缺点

  1. 来电者可能不知道情况是什么
  2. 这并不能解决更大的问题,如果我们有其他调用者未验证条件怎么办?

建议2——类(class)责任

class Processor
{
public:

    Processor()
    {
        // init m_bIsEnabled based on conditions
    }

    void Activate()
    {
        if (!m_bIsEnabled)
            return;

        // do something
    }
    /* some more interface functions*/
private:
    bool m_bIsEnabled;
};

在这种情况下,如果类未启用,则所有公共(public)接口(interface)功能都将被禁用。

缺点

  1. 如果 Processor 类有很多接口(interface)函数怎么办,我们是否在每个函数的开头检查 m_bIsEnabled 的值?
  2. 如果将来某些开发人员增强了接口(interface)而忘记检查 m_bIsEnabled 的值怎么办?
  3. m_bIsEnabled == false 情况下每个函数返回的默认值是什么

建议3——工厂

using Processor_ptr = shared_ptr < Processor > ;

class ProcessorFactory
{
    static Processor_ptr create()
    {
        Processor_ptr p;

        p.reset(new Processor);
        if (!p->IsEnabled())
            p.reset(nullptr);

        return p;
    }
};


class Processor
{
public:
    void Activate();
    bool IsEnabled();
    friend class ProcessorFactory;
private:
    Processor();
    bool m_bIsEnabled;
};

到目前为止,这种方法是我最喜欢的,因为如果它无法运行,我们会阻止类生成。

缺点 1. 也许矫枉过正?


问题

就最佳实践而言,哪项建议更可取?我们还有其他建议吗?

最佳答案

我会选择 #3 选项,因为选项 #2 和 #1 很难跟踪并强制开发人员始终在每个函数执行之前验证 Active 标志。此外,您可以通过返回一个实现接口(interface)但实际上什么都不做的空对象来扩展选项 #3。

关于c++ - 当类在某些情况下无法运行时,如何禁用类 API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28669097/

相关文章:

c++ - C++中 "()"如何将语句转换为表达式?

Python - 类上的描述符用于*设置*属性

Python--从列表中删除对象

c++ - 作为映射键的对象在 cpp 中变为 const

c++ - GCC 和 Clang 在 constexpr 构造函数上的不同行为

c++ - 从模板基类继承构造函数而不重复模板参数?

c++ - 使用 SDL 的硬件缓冲,关于它如何工作的问题

C++ 访问受信任的根证书

c++ - 在不同的类中使用单例

java - Android 应用程序逻辑类 : service, 处理程序,...?