一个典型的访问者模式的设计是这样的:如何阻止访客?
template<class Visitor>
void processData(Visitor& visitor)
{
// maybe in sequence
visitor.process(...);
visitor.process(...);
...
// may have expensive computations
doExpensiveComputations();
// or in some loops
for (...)
visitor.process(...);
// or in some recursive calls
recursive(visitor);
}
怎能游客尽快返回,当它失去其余数据的利益(例如,回答被发现)?
请注意,任何需要更改设计的内容都是不可接受的,例如,我不想强制Visitor :: process返回值并每次检查一次。
我真正想要做的是强制堆栈展开,我可以使用异常,但它已被告知使用异常控制流是反模式。
我想Boost.Coroutine可能会有帮助,但它仍然使用例外栈展开......
我现在要做的就是象下面这样:
struct Visitor
{
void process(T data)
{
if (stopped)
return;
...
}
...
};
但是,这仍然会往下走的路的执行,以及我们不需要的昂贵的计算。
由于除了可以展开堆栈的异常外,在C++中没有其他可移植的方式,所以我应该在这里使用异常来控制流?
什么是“改变设计”? – 2014-09-01 10:07:24
“使用控制流的异常是反模式” - 选择你的毒药 - 创建一个更灵活的“访问者”,以便尽早返回代码,使用异常,或让它变慢。良好的编程是关于挑选全能最好/最差的,并且当你不得不做很显着的事情时添加有价值的文档和防御性代码。 – 2014-09-01 10:45:16
这是一个“反模式”并不一定意味着它总是错的。这听起来像是这种情况之一,当它不是一件坏事。以及boost.coroutine如何实现*不应该影响您的代码是否使用它;这是将代码封装在库中的一点。如果它适合你的目的,那么这可能是最好的选择。 – molbdnilo 2014-09-01 11:21:39