假设我有以下内容:
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
类的发起者负责确保在发起类之前满足这些条件。
缺点
- 来电者可能不知道情况是什么
- 这并不能解决更大的问题,如果我们有其他调用者未验证条件怎么办?
建议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)功能都将被禁用。
缺点
- 如果
Processor
类有很多接口(interface)函数怎么办,我们是否在每个函数的开头检查m_bIsEnabled
的值? - 如果将来某些开发人员增强了接口(interface)而忘记检查
m_bIsEnabled
的值怎么办? - 在
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/