假设我有一个处理某些数据的类:
class SomeClass
{
public:
void SetData(IData*);
void ProcessData(void);
}
在调用ProcessData()之前,类需要设置数据。我该如何强制执行此依赖项?如果在传入任何数据之前调用ProcessData(),我可以返回错误代码或抛出异常。如何抛出异常声音?
其他信息 一些答案建议将IData传递给构造函数或ProcessData()。这些都是合理的答案。我之所以不这样做是因为这是GUI系统的一部分;用户可以在任何时间点将新数据加载到SomeClass并对其进行修改,因此在创建SomeClass时,数据可能无法使用。
(是的,我可以使用更好的设计来避免这个问题,但是我的老板希望在屏幕上看到结果,我必须在好的设计和视觉效果之间做出妥协)。
答案 0 :(得分:4)
使SomeClass
构造函数需要IData
并删除SetData
。同样,您也可以将IData
传递给ProcessData
。
答案 1 :(得分:2)
您可以选择直接在ProcessData方法的签名中要求数据。因此,它将公开其公共合同 - 需要这些特定数据才能发挥作用。
class SomeClass
{
public:
//void SetData(IData*);
void ProcessData(IData*);
}
或者您可能需要在对象构造中设置数据,然后才能调用该实例上的任何方法。
class SomeClass
{
public:
SomeClass (IData* data) { SetData (data); }
void ProcessData(IData*);
private:
void SetData(IData*);
}
答案 2 :(得分:2)
或者如何删除SetData
并使流程方法直接获取数据,即ProcessData(IData*)
?如果这对您不起作用,抛出异常是比使用错误代码更好的解决方案。
答案 3 :(得分:0)
在文档中抛出异常和写这种依赖关系听起来非常好。这就是例外情况:做出先决条件有效性的断言!