我有一个在单独的线程中运行的C ++对象,其状态以异步方式更新。该代码类似于以下内容:
class Controller : public Listener {
public:
// Controller methods, to be called by the user from the main thread
// My problem is that I am obliged to duplicate the call to validateState() in all methods
void doAction1() {
validateState(); // explicit call to validate state
}
void doAction2() {
validateState(); // explicit call to validate state duplicated here and in every doActionX() method.
}
...
private:
// Override Listener virtual methods(which are used as callbacks), called in an async manner
void onXYZ() override;
void onError(std::string) override { /* update m_error */ }
...
// validate that no error has occurred
void validateState() {
if(m_error) throw m_error;
}
private:
Error m_error; // updated
};
我想到了一个解决方案,可以重载
operator->
并在内部调用一次validateState()
,从而删除重复的调用。但是,问题在于用户必须执行controller->doAction1()
并被禁止执行controller.doAction1()
。我还可以通过这种方法想到其他语义问题:
有人希望对内存管理问题(例如具有自定义分配器)进行重载
operator->
,而不仅仅是任何随机操作。->
和.
之间缺乏对称性在新添加的方法上复制对
validateState()
的调用是否可以在这里进行?目的是避免过度设计的设计。在这里什么是可行的方法/设计?
最佳答案
对于一个类的所有公共函数来说,调用相同的私有函数是完全可以的。您的功能只是确保隐式this
参数有效,这与任何其他参数验证相同
void Controller::doAction1(Arg1 arg1)
{
// ensure preconditions hold
validateState();
validateArg1(arg1);
// "real" code
}
void Controller::doAction2(Arg2 arg2, Arg3 arg3)
{
// ensure preconditions hold
validateState();
validateArg2(arg2);
validateArg3(arg3);
// "real" code
}