如何在访问时验证 C++ 对象的状态而不重复
How can I validate a C++ object's state upon access without duplication
我在单独的线程中有一个 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()
可以吗?目的是避免过度设计。
什么是合理的 approach/design?
class 的所有 public 函数都可以调用同一个私有函数。您的函数只是确保隐式 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
}
我在单独的线程中有一个 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()
可以吗?目的是避免过度设计。
什么是合理的 approach/design?
class 的所有 public 函数都可以调用同一个私有函数。您的函数只是确保隐式 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
}