一個典型的訪問者模式的設計是這樣的:如何阻止訪客?
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