gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 16:11:02 26 4
gpt4 key购买 nike

假设我有以下内容:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com